MySQL多表联合查询求助:合并3张表显示所有行报错ERROR 1222
解决MySQL三张表全外连接显示所有行的问题
看起来你在尝试实现三张表的全外连接(显示所有表的全部行,包括未关联记录),但遇到了两个关键问题导致报错1222,我来帮你拆解并解决:
你的查询出错的原因
- 字段拼写错误:第三个SELECT语句里的
countries.countries_id是笔误,应该是countries.country_id,这是导致第三个部分执行失败的直接原因。 - UNION ALL的列结构不匹配:UNION/UNION ALL要求所有SELECT子句返回的列数、列顺序、数据类型必须完全一致,但你的几个查询返回的结果结构完全不同:
- 前两个查询是关联clients和awards,返回的是clients+awards的列
- 后两个查询是关联clients和countries,返回的是clients+countries的列
这种结构不一致会触发1222 - The used SELECT statements have a different number of columns错误。
正确的实现思路
MySQL本身不支持FULL OUTER JOIN,所以我们需要用LEFT JOIN + UNION的组合来模拟全外连接,步骤如下:
- 先实现clients和awards的全外连接,得到所有客户和奖项的记录(包括没有客户的奖项、没有奖项的客户)
- 再将这个中间结果和countries做全外连接,得到所有国家的记录(包括没有关联客户/奖项的国家)
最终的查询语句
SELECT t.client_id, t.first_name, t.award_id, t.award_name, t.country_id, co.country_name FROM ( -- 第一步:clients和awards的全外连接 SELECT c.client_id, c.first_name, c.award_id, a.award_name, c.country_id FROM clients c LEFT JOIN awards a ON c.award_id = a.award_id UNION SELECT NULL AS client_id, NULL AS first_name, a.award_id, a.award_name, NULL AS country_id FROM awards a LEFT JOIN clients c ON a.award_id = c.award_id WHERE c.client_id IS NULL -- 筛选出没有对应客户的奖项 ) t LEFT JOIN countries co ON t.country_id = co.country_id UNION -- 第二步:添加没有关联任何客户/奖项的国家 SELECT NULL AS client_id, NULL AS first_name, NULL AS award_id, NULL AS award_name, co.country_id, co.country_name FROM countries co LEFT JOIN ( SELECT c.client_id, c.first_name, c.award_id, a.award_name, c.country_id FROM clients c LEFT JOIN awards a ON c.award_id = a.award_id UNION SELECT NULL AS client_id, NULL AS first_name, a.award_id, a.award_name, NULL AS country_id FROM awards a LEFT JOIN clients c ON a.award_id = c.award_id WHERE c.client_id IS NULL ) t ON co.country_id = t.country_id WHERE t.client_id IS NULL;
验证结果
这个查询会返回所有符合要求的记录:
- 所有clients的记录,关联对应的award_name和country_name
- 所有awards的记录,即使没有对应的client(client_id、first_name、country_id为NULL)
- 所有countries的记录,即使没有对应的client/award(client_id、first_name、award_id、award_name为NULL)
内容的提问来源于stack exchange,提问作者ben
相关产品推荐
相关产品推荐

