[Résolu] Aide requête SQL: item n'appartenant pas à une catégorie

Aide requête SQL: item n'appartenant pas à une catégorie [Résolu] - SQL/NoSQL - Programmation

Marsh Posté le 24-01-2008 à 17:06:18    

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 :
  1. SELECT items.label FROM items
  2. LEFT OUTER JOIN category2items ON category2items.ID_item = items.ID_item
  3. 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
Reply

Marsh Posté le 24-01-2008 à 17:06:18   

Reply

Marsh Posté le 24-01-2008 à 17:32:31    

a la bourrin avec un distinct + not exits:

Code :
  1. SELECT DISTINCT items.label FROM items i1
  2.    LEFT OUTER JOIN category2items ci1 ON ci1..ID_item = i1.ID_item
  3.    LEFT OUTER JOIN categories c1 ON (c1.ID_category = ci1.ID_category AND c1.flag <> '1' )
  4.  WHERE NOT EXISTS ( SELECT i2.label FROM items AS i2
  5.    INNER JOIN category2items AS ci2 ON ci2.ID_item = i2.ID_item
  6.    INNER JOIN categories AS c2 ON (c2.ID_category = ci2.ID_category AND c2.flag ='1')
  7. WHERE i2.ID_item = i1.ID_item)

Reply

Marsh Posté le 24-01-2008 à 17:59:29    

Rhaa le NOT EXISTS, tellement longtemps que je l'ai plus utilisé, que je l'ai oublié celui-là, merci beaucoup !

 

Le temps d'adapter ça à mes requêtes nettement plus trash, et ça devrait remplir exactement ce que je cherche,

 

merci encore

 

*Edit* : YEAH ça marche ! tu rox anapajari merci bcp ! :jap:


Message édité par ZeBix le 24-01-2008 à 18:09:35
Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed