2010-04-05 192 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