MySQL GROUP_CONCAT + IN()=缺少数据:-(

时间:2010-04-05 04:21:20

标签: sql mysql group-concat

示例:

表:框

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

我的问题是:为什么不列出has列中的所有contents值?为什么我的WHERE语句也会裁剪我的GROUP_CONCAT

我以为我会得到的表是:

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

虽然我想根据boxID声明限制WHERE结果,但希望限制有效框的contents字段。 : - /

帮助?

1 个答案:

答案 0 :(得分: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