问题描述
我正在尝试编写一个MySQL查询,该查询将如下所述连接所有3个表...
我的桌子:
clients
| client_id | first_name | award_id | country_id |
| 1 | jon | 3 | 2 |
| 2 | gary | 5 | 4 |
| 3 | ted | 1 | 2 |
| 4 | liz | 3 | 5 |
| 5 | bill | 1 | 5 |
awards
| award_id | award_name |
| 1 | award_1 |
| 2 | award_2 |
| 3 | award_3 |
| 4 | award_4 |
| 5 | award_5 |
| 6 | award_6 |
countries
| country_id | country_name |
| 1 | England |
| 2 | Ireland |
| 3 | USA |
| 4 | France |
| 5 | Finland |
| 6 | Holland |
| 7 | Germany |
| 8 | Spain |
我想要的输出:
query_results
| client_id | first_name | award_id | country_id | award_id | award_name | country_id | country_name |
| 1 | jon | 3 | 2 | 3 | award_3 | 2 | Ireland |
| 2 | gary | 5 | 4 | 5 | award_5 | 4 | France |
| 3 | ted | 1 | 2 | 1 | award_1 | 2 | Ireland |
| 4 | liz | 3 | 5 | 3 | award_3 | 5 | Finland |
| 5 | bill | 1 | 5 | 1 | award_1 | 5 | Finland |
| null | null | null | null | 2 | award_2 | null | null |
| null | null | null | null | 4 | award_4 | null | null |
| null | null | null | null | 6 | award_6 | null | null |
| null | null | null | null | null | null | 1 | England |
| null | null | null | null | null | null | 3 | USA |
| null | null | null | null | null | null | 6 | Holland |
| null | null | null | null | null | null | 7 | Germany |
| null | null | null | null | null | null | 8 | Spain |
我一直在尝试将这些与以下查询结合起来...
SELECT * FROM clients
LEFT JOIN countries ON clients.award_id = awards.award_id
UNION ALL
SELECT * FROM clients
RIGHT JOIN awards ON clients.award_id = awards.award_id
UNION ALL
SELECT * FROM clients
LEFT JOIN countries ON clients.country_id = countries.countries_id
UNION ALL
SELECT * FROM clients
RIGHT JOIN countries ON clients.country_id = countries.countries_id
此查询失败,错误代码为1222。但是第一个UNION有效,但第三个失败。 任何帮助将不胜感激
解决方法
多个查询的联合具有从每个查询返回的相同列数。您可以通过添加每个查询中不存在的列的null
值来做到这一点。
SELECT *
FROM clients c
LEFT JOIN awards a ON c.award_id = a.award_id
LEFT JOIN countries cs ON c.country_id = cs.country_id
UNION ALL
SELECT NULL,NULL,a1.award_id,a1.award_name,null
FROM awards a1
UNION ALL
SELECT NULL,c1.country_id,c1.country_name
FROM countries c1
,
这里不需要使用UNION,因为在所有3个表中都需要匹配和不匹配的数据时,请在2个表上首先使用FULL OUTER JOIN,然后使用该查询的结果与FULL OUTER再次与第三个表联接由于所需的输出具有匹配行和不匹配行,因此需要加入。 代码:
SELECT pop.client_id,pop.first_name,pop.award_id,pop.country_id,c.award_id,c.award_name,pop.countryid,pop.countryname
FROM (SELECT a.client_id,a.first_name,a.award_id,a.country_id,b.country_id AS countryid,b.country_name AS countryname
FROM clients a
FULL OUTER JOIN countries b
ON a.country_id = b.country_id) pop
FULL OUTER JOIN awards c
ON c.award_id = pop.award_id
ORDER BY client_id,award_name nulls last;