在一个查询中获取所有国家/地区和州

时间:2017-04-27 11:10:34

标签: mysql sql select join

我有三张包含以下数据的表格:

countries
+-----+----------+
| id  |   name   |
+-----+----------+
| 1   | country1 |
| 7   | country2 |
+-----+----------+

states
+-----+----------+------------+
| id  |   name   | country_id |
+-----+----------+------------+
| 3   | state1   |     1      |
| 9   | state2   |     7      |
| 11  | state3   |     1      |
| 17  | state4   |     1      |
+-----+----------+------------+

cities
+-----+----------+------------+
| id  |   name   |  state_id  |
+-----+----------+------------+
| 5   | city1    |     3      |
| 6   | city2    |     9      |
| 22  | city3    |     9      |
| 24  | city4    |     17     |
| 25  | city5    |     11     |
| 26  | city6    |     11     |
+-----+----------+------------+

我正在尝试选择所有数据,以便生成以下输出:

+-----+---------------------------+--------+-------+
| id  |   table_name   | country  | state  |  city |
+-----+---------------------------+--------+-------+
| 1   |    countries   | country1 |        |       |
| 3   |      states    | country1 | state1 |       |
| 5   |      cities    | country1 | state1 | city1 |
| 11  |      states    | country1 | state3 |       |
| 25  |      cities    | country1 | state3 | city5 |
| 26  |      cities    | country1 | state3 | city6 |
| 17  |      states    | country1 | state4 |       |
| 24  |      cities    | country1 | state4 | city4 |
| 7   |    countries   | country2 |        |       |
| 9   |      states    | country2 | state2 |       |
| 5   |      cities    | country2 | state2 | city2 |
| 5   |      cities    | country2 | state2 | city3 |
+-----+---------------------------+--------+-------+

我知道这很有挑战性,但我想知道是否可以用SELECT生成这样的结果,还是只能以编程方式完成?谢谢!

3 个答案:

答案 0 :(得分:2)

您需要这3个SQL语句:

所有城市:

SELECT cit.id, 'cities', cont.name, st.name, cit.name 
FROM countries cont 
INNER JOIN states st ON  cont.id = st.country_id 
INNER JOIN  join cities cit ON st.id = cit.state_id

所有州:

SELECT stat.id, 'states', cont.name, st.name, '' 
FROM  countries cont 
INNER JOIN states st ON cont.id = st.country_id

所有国家/地区;

SELECT cont.id, 'countries', cont.name, '', '' FROM countries cont 

然后你可以将它们组合起来像

SELECT cit.id, 'cities', cont.name, st.name, cit.name 
FROM countries cont 
INNER JOIN states st ON  cont.id = st.country_id 
INNER JOIN  join cities cit ON st.id = cit.state_id

  UNION ALL

SELECT stat.id, 'states', cont.name, st.name, '' 
FROM  countries cont 
INNER JOIN states st ON cont.id = st.country_id

  UNION ALL

SELECT cont.id, 'countries', cont.name, '', '' FROM countries cont 

答案 1 :(得分:0)


您可以使用以下查询

SELECT  C.id,  C.name AS table_name, 'country1' AS country, S.name AS state, CI.city 
FROM COUNTRIES C
FULL OUTER JOIN STATES S
ON (C.ID = S.ID)
FULL OUTER JOIN CITIES CI
ON (C.ID=CI.ID);

Or you can use

SELECT  C.id,  C.name AS table_name, 'country1' AS country, S.name AS state, CI.city 
FROM COUNTRIES C, STATES S, CITIES CI
WHERE C.ID = (+)S.ID AND
C.ID=(+)CI.ID;

答案 2 :(得分:0)

在我看到@nos已经提供了几乎完全相同的答案之前,我写过这个。此版本添加字段别名,根据OP的示例输出对数据进行排序,避免输入错误。

select
    c.id,
    'countries' as table_name,
    c.name as country,
    '' as state,
    '' as city
from countries c
union
select
    s.id,
    'states' as table_name,
    c.name as country,
    s.name as state,
    '' as city
from countries c
JOIN states s ON c.id = s.country_id
union
select
    ci.id,
    'cities' as table_name,
    c.name as country,
    s.name as state,
    ci.name as city
from countries c
JOIN states s ON c.id = s.country_id
JOIN cities ci ON s.id = ci.state_id
order by country, state, city