Bonjour tous,
Ce que je cherche ici, je peux déjà l'obtenir avec des scripts (PHP, etc.) mais je voudrais dans la mesure du possible essayer de l'avoir en une seule requête SQL (aucun problème si celle-ci comporte des requêtes imbriquées) :
Voici la structure des tables (simplifiée pour l'explication) :
items
- ID_item
- label
categories2items
- ID_item
- ID_category
categories
- ID_category
- label
- flag
Situation classique: relation n-n entre items et catégories. "flag" peut être à 0 ou 1.
Je voudrais une liste d'items qui, parmi leurs catégories (et ils peuvent en avoir aucune ou plusieurs, donc), n'en aient AUCUNE qui soit flaggée "1".
Exemple :
Item A : catégories 1 - 2 - 3
Item B : catégories 1 - 3 - 4
Item C : pas de catégories
Item D : catégories 1 - 2 - 5
La catégorie 2 est flaggée 1
Je veux donc les items B et C
Code :
SELECT items.label FROM items LEFT OUTER JOIN category2items ON category2items.ID_item = items.ID_item LEFT OUTER JOIN categories ON (categories.ID_category = category2items.ID_category AND categories.flag <> '1')
|
me donne tous les items, avec s'ils en ont une, une catégorie pourvu que celle-ci ne soit pas flaggée 1 (j'emploi des outer joins pour prendre les items qui n'ont aucune catégorie).
Deux problèmes :
- Si un item a disons 2 catégories, et que l'une d'elles n'est pas flaggée 1, eh bien l'item est quand même pris
- Un même item apparaîtra autant de fois dans la liste qu'il a de catégories, je voudrais que mon check se résume à savoir si PARMI les catégories, l'une d'elle est flaggé, si oui on prend l'item, si non on le le prend pas. Il ne devrait donc apparaître que une seule fois dans le record set.
Voilà je cale un peu, je suppute que cela doit être possible en une requête ... cela m'aiderait énormément !
Message édité par ZeBix le 24-01-2008 à 17:59:43