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

时间:2018-03-27 21:04:24

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

我有两张桌子(水果,维生素)和多对多关系表(fruit_vitamin)

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

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

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

2 个答案:

答案 0 :(得分:1)

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

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

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