繁体   English   中英

在一个查询中获取所有国家的州和城市

[英]Get all countries states and cities in one query

我有三个表,其中包含以下数据:

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条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 


您可以使用以下查询

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;

在看到@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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM