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

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

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

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 的情况下过滤结果?

最佳答案

试试这个:

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

关于mysql - 显示独立于 where 子句的所有连接结果,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49522376/

相关文章:

php - 从 mysql 获取数组的反转结果

mysql - MySQL JDBC Driver中的cachePrepStmts和useServerPrepStmts有什么区别

php - foreach 和数组的错误

mysql - 从另一个表计数的 SQL

php while 循环在 while 循环内 - 需要连接吗?

尽管没有显示错误,但 Java 数组元素未插入到 MySQL 表中

sql - 要删除,更改实体的标志 VS 移动到另一个表?

java - Connection.setAutoCommit(true) 是否适用于 SQL 存储过程和函数?

用户的 MySQL 投票历史记录以及每个项目的总投票数

mysql - 如何使用 JOIN 和 WHERE 语句过滤记录?