【问题标题】:Combine 3 tables to show all rows组合 3 个表格以显示所有行
【发布时间】:2020-09-29 14:40:59
【问题描述】:

我正在尝试编写一个 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 有效,但在第三个时失败。 非常感谢任何帮助

【问题讨论】:

标签: mysql join union


【解决方案1】:

多个查询的联合具有从每个查询返回的相同数量的列。您可以通过添加每个查询中不存在的列的 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, NULL, NULL, a1.award_id, a1.award_name, NULL, null
FROM awards a1

UNION ALL 

SELECT NULL, NULL, NULL, NULL, NULL, NULL, c1.country_id, c1.country_name
FROM countries c1

【讨论】:

    【解决方案2】:

    您不需要在这里使用 UNION,因为您需要所有 3 个表中的匹配和不匹配数据都首先在 2 个表上使用 FULL OUTER JOIN,然后使用该查询的结果再次使用 FULL OUTER 与第三个表连接JOIN,因为 Desired Output 有匹配+不匹配的行。 代码:

    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; 
    

    【讨论】:

    • 我们在 MySQL 中有 Full outer join
    • 啊,我错过了有问题的 MySQL 部分。
    • 我们在 MySQL 中没有完全外连接,但可以通过在左连接和右连接上执行 UNION ALL/UNION 来创建它。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-03-28
    • 1970-01-01
    • 2017-11-10
    • 1970-01-01
    • 2019-11-01
    相关资源
    最近更新 更多