Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/61.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/74.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Mysql 在一个查询中获取所有国家/地区、州和城市_Mysql_Sql_Select_Join - Fatal编程技术网

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

Mysql 在一个查询中获取所有国家/地区、州和城市,mysql,sql,select,join,Mysql,Sql,Select,Join,我有三个表,其中包含以下数据: countries +-----+----------+ | id | name | +-----+----------+ | 1 | country1 | | 7 | country2 | +-----+----------+ states +-----+----------+------------+ | id | name | country_id | +-----+----------+------------+ | 3

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

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生成这样的结果,或者只能通过编程实现?谢谢


您可以使用下面的查询

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;

您需要以下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 

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

这与js有什么关系?去看看JoinNo你不能使用union,union要求所有文件中有相同数量的列tables@JimMacaulay如果您提供虚拟值,您可以。。MySQL的可能副本不支持完全外部连接。(+)S.ID是无效的构造。有趣的是,哪种风格的sql支持这一点?