显示独立于 where 子句的所有连接结果
Showing all joined results independent from where clause
我有两个 table(水果、维生素)和一个多对多关系 table (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?
的情况下过滤结果
子查询和过滤器工作:
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%'
试试这个:
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
我有两个 table(水果、维生素)和一个多对多关系 table (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?
的情况下过滤结果子查询和过滤器工作:
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%'
试试这个:
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