代码之家  ›  专栏  ›  技术社区  ›  denoise

显示独立于where子句的所有联接结果

  •  1
  • denoise  · 技术社区  · 7 年前

    我有两个表(水果,维生素)和一个多对多关系表(水果,维生素)

    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
    

    结果如下: result1

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

    WHERE `vitamin`.`id` = 4
    

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

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

    2 回复  |  直到 7 年前
        1
  •  1
  •   kc2018    7 年前

    尝试以下操作:

    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
  •  1
  •   dfundako    7 年前

    子查询和筛选工作:

    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%'