2017-04-27 155 views
1

我有三个表数据如下:获得所有国家的州和城市在一个查询

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产生这样的结果,还是只能通过编程来完成?谢谢!

+0

这和js有什么关系? – madalinivascu

+0

去看看加入吧 – madalinivascu

+0

不,你不能使用union,union需要所有表中共同的列数 –

回答

1

你需要这三个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 

铝l国家;

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 
+0

做了窍门,谢谢! –

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; 
+0

我不认为MySQL支持完整的外部联接。 – jarlh

+0

(+)S.ID是一个无效构造。为什么sql的这个风格支持这个问题? –

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 
相关问题