2010-04-05 327 views
1

實施例缺少的數據:MySQL的GROUP_CONCAT + IN()= :-(

表:框

boxID color 
01  red 
02  blue 
03  green 

表:boxHas

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

我想在每個內容查詢框,並返回一個表,每個ID,顏色和一列連接每個框的內容,所以我使用:

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

,我得到的結果如下表:

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

我的問題是:爲什麼不是列出contents列中的所有has值?爲什麼我的WHERE聲明也裁剪了我的GROUP_CONCAT

我想我一定要得到的表是:

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

雖然我想基於WHERE語句來限制我boxID結果,我做要限制有效盒contents場。 : -/

幫助?

回答

2

必須使用HAVING子句而不是WHERE:

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

這正是我需要的。在相同的查詢中可以使用-WAVE-與-WHERE-一起使用嗎? – Drew 2010-04-05 04:43:53

+0

是的,他們可以在同一時間使用,只要記住WHERE是每行的第一個過濾器,並且HAVING是第二個過濾器,它作用於您的聚集(分組)數據 – 2010-04-05 04:48:31

+0

再次感謝您。這是一個大規模的自定義查詢中最後一塊失蹤! :-) – Drew 2010-04-05 05:08:27