【问题标题】:Showing all joined results independent from where clause显示独立于 where 子句的所有连接结果
【发布时间】:2018-09-06 10:08:45
【问题描述】:

我有两个表(fruit、vitamin)和多对多关系表(fruit_vitamin)

我使用以下查询在逗号分隔的列中列出所有水果及其各自的维生素:

SELECT `fruit`.`name`,
GROUP_CONCAT(DISTINCT `vitamin`.`name` ORDER BY `vitamin`.`id` ASC SEPARATOR ', ') `vitamins`
FROM `fruit`
LEFT JOIN `fruit_vitamin` `fv` ON `fruit`.`id` = `fv`.`fruit_id`
LEFT JOIN `vitamin` ON `vitamin`.`id` = `fv`.`vitamin_id`
WHERE 1
GROUP BY `fruit`.`id` 
ORDER BY `fruit`.`name` ASC

结果如下:

现在,如果我尝试过滤结果,以便仅显示含有维生素 B12 的水果,例如,添加 where 子句:

WHERE `vitamin`.`id` = 4

查询显示正确的水果,但维生素 concat 结果仅显示维生素 B12,尽管水果实际上含有更多维生素。

我做错了什么?如何在不影响 GROUP_CONCAT 的情况下过滤结果?

【问题讨论】:

    标签: mysql sql join many-to-many group-concat


    【解决方案1】:

    试试这个:

    SELECT `fruit`.`name`,
    GROUP_CONCAT(DISTINCT `vitamin`.`name` ORDER BY `vitamin`.`id` ASC SEPARATOR ', ') `vitamins`
    FROM `fruit`
    LEFT JOIN `fruit_vitamin` `fv` ON `fruit`.`id` = `fv`.`fruit_id`
    LEFT JOIN `vitamin` ON `vitamin`.`id` = `fv`.`vitamin_id`
    WHERE `fruit`.id IN (SELECT `fruit_id` FROM `fruit_vitamin` WHERE `vitamin_id` = 4)
    GROUP BY `fruit`.`id` 
    ORDER BY `fruit`.`name` ASC
    

    【讨论】:

      【解决方案2】:

      子查询和过滤器的工作原理:

      SELECT * 
      FROM (
          SELECT `fruit`.`name`,
          GROUP_CONCAT(DISTINCT `vitamin`.`name` ORDER BY `vitamin`.`id` ASC SEPARATOR ', ') `vitamins`
          FROM `fruit`
          LEFT JOIN `fruit_vitamin` `fv` ON `fruit`.`id` = `fv`.`fruit_id`
          LEFT JOIN `vitamin` ON `vitamin`.`id` = `fv`.`vitamin_id`
          WHERE 1
      GROUP BY `fruit`.`id` 
      ) x
      WHERE vitamins LIKE '%B12%'
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2016-05-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2017-04-04
        • 1970-01-01
        相关资源
        最近更新 更多