如何将UNION多表查询结果与Project表关联获取项目名称?
解决MySQL关联Project表查询1995年项目的问题
你原来的代码错误在于把UNION和JOIN的用法搞混了,核心问题如下:
- UNION的每个子查询必须返回相同数量、对应类型的列,你最后一个查询只返回
project_name,和前面的project_id列不匹配; - UNION的每个分支是独立查询,不能跨分支引用其他查询的别名(比如用
s.project_id关联最后一个查询的表); - 重复使用了
Project表的别名p,属于语法错误。
下面是两种正确的解决方案:
方案一:子查询关联Project表
先通过UNION获取所有1995年相关的唯一project_id,再把这个结果作为子查询和Project表关联,获取对应项目名称:
SELECT distinct_projects.project_id, p.project_name FROM ( SELECT s.project_id FROM `Song` s WHERE song_year_released = '1995' UNION SELECT r.project_id FROM `Remix` r WHERE remix_year_released = '1995' UNION SELECT rl.project_id FROM `Release` rl WHERE release_year = '1995' ) AS distinct_projects INNER JOIN `Project` p ON distinct_projects.project_id = p.project_id;
注:UNION会自动去重,所以子查询里的project_id都是唯一值。
方案二:使用IN子句直接筛选Project表
更简洁的写法,直接在Project表的查询中,用UNION结果作为project_id的筛选条件:
SELECT p.project_id, p.project_name FROM `Project` p WHERE p.project_id IN ( SELECT s.project_id FROM `Song` s WHERE song_year_released = '1995' UNION SELECT r.project_id FROM `Remix` r WHERE remix_year_released = '1995' UNION SELECT rl.project_id FROM `Release` rl WHERE release_year = '1995' );
内容的提问来源于stack exchange,提问作者Mitch
相关产品推荐
相关产品推荐

