2010-04-05 11 views
1

Exemple:MySQL GROUP_CONCAT + IN() = données manquantes :-(

Tableau: Boîte

boxID color 
01  red 
02  blue 
03  green 

Tableau: boxHas

boxID has 
01  apple 
01  pear 
01  grapes 
01  banana 
02  lime 
02  apple 
02  pear 
03  chihuahua 
03  nachos 
03  baby crocodile 

Je veux interroger sur le contenu de chaque boîte, et retourne une table avec chaque ID, couleur, et une colonne qui concatène le contenu de chaque boîte, donc j'utilise:

SELECT box.boxID, box.color,
GROUP_CONCAT(DISTINCT boxHas.has SEPARATOR ", ") AS contents
FROM box
LEFT JOIN boxHas ON box.boxID=boxHas.boxID
WHERE boxHas.has IN ('apple','pear')
GROUP BY box.boxID
ORDER BY box.boxID

et je reçois le tableau suivant des résultats:

boxID color contents 
01  red apple, pear 
02  blue apple, pear 

Ma question est: pourquoi ne pas énumérer toutes les valeurs has dans la colonne contents? Pourquoi mon instruction WHERE recadre-t-elle également mon GROUP_CONCAT?

Le tableau que je pensais que j'allais faire est:

boxID color contents 
01  red apple, banana, grapes, pear 
02  blue apple, lime, pear 

Bien que je veux limiter mes boxID résultats en fonction de la déclaration WHERE, je ne pas veulent limiter le champ contents pour les boîtes valides . : -/

Aide?

Répondre

2

vous devez utiliser la clause HAVING au lieu de OÙ:

SELECT box.boxID 
    , box.color 
    , GROUP_CONCAT(DISTINCT boxHas.has SEPARATOR ", ") AS contents 
    FROM box 
    LEFT JOIN boxHas 
    ON box.boxID=boxHas.boxID 
GROUP BY box.boxID 
HAVING SUM(boxHas.has IN ('apple','pear')) >= 2 
ORDER BY box.boxID 
+0

C'est ce que je avais besoin. Peut -HAVING- être utilisé avec -WHERE- dans la même requête? – Drew

+0

Oui, ils peuvent être utilisés en même temps, il suffit de garder à l'esprit que WHERE est le premier filtre pour chaque ligne, et HAVING est le deuxième filtre qui agit sur vos données agrégées (groupées) –

+0

Merci encore. C'était la dernière pièce manquante dans une requête personnalisée massive! :-) – Drew