[英]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.