示例:
表:框
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
字段。 : - /
帮助?
答案 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