【问题标题】:MySQL GROUP_CONCAT + IN() = missing data :-(MySQL GROUP_CONCAT + IN() = 缺失数据 :-(
【发布时间】:2011-02-04 08:03:48
【问题描述】:

例子:

表格:盒子

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 字段的有效框。 :-/

帮助?

【问题讨论】:

    标签: sql mysql group-concat


    【解决方案1】:

    你必须使用 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
    

    【讨论】:

    • 这是我需要的。 -HAVING- 可以与 -WHERE- 在同一个查询中使用吗?
    • 是的,它们可以同时使用,请记住,WHERE 是每行的第一个过滤器,而 HAVING 是第二个过滤器,作用于您的聚合(分组)数据
    • 再次感谢您。这是大规模自定义查询中缺少的最后一块! :-)
    猜你喜欢
    • 2013-03-08
    • 2014-01-14
    • 2011-11-07
    • 2014-03-09
    • 2012-07-28
    • 2021-10-23
    • 2017-05-24
    • 1970-01-01
    • 2014-10-26
    相关资源
    最近更新 更多