【发布时间】:2015-04-03 02:55:11
【问题描述】:
我正在尝试加入 3 张桌子,但看起来我做错了什么。另外我不确定 INNER JOIN 在这里是否是一个好主意,因为其他表中可能缺少一些相应的行,但我仍然希望它们显示为 NULL,那么也许 LEFT JOIN 会更好,但我又一次我做错了什么。
表格响应的快速摘要:
SELECT geonameid, name, iso_alpha2, admin1_code
FROM maxmind_cities1000
WHERE name LIKE 'tron%' LIMIT 20;
+-----------+------------------------+------------+-------------+
| geonameid | name | iso_alpha2 | admin1_code |
+-----------+------------------------+------------+-------------+
| 1605268 | Tron | TH | 10 |
| 8949073 | Tronca | IT | 03 |
| 3107444 | Tronchón | ES | 52 |
| 8859151 | Tronconal | MX | 21 |
| 2821000 | Tröndel | DE | 10 |
| 3133880 | Trondheim | NO | 16 |
| 1252408 | Trongsa | BT | 21 |
| 2667264 | Trönninge | SE | 06 |
| 6535739 | Trontano | IT | 12 |
| 2971582 | Tronville-en-Barrois | FR | B2 |
| 3165134 | Tronzano Lago Maggiore | IT | 09 |
| 3165133 | Tronzano Vercellese | IT | 12 |
+-----------+------------------------+------------+-------------+
SELECT iso_alpha2, name
FROM maxmind_countryinfo
WHERE iso_alpha2 = 'NO';
+------------+--------+
| iso_alpha2 | name |
+------------+--------+
| NO | Norway |
+------------+--------+
SELECT code, name_local
FROM maxmind_admin1_codes_ascii
WHERE code = 'NO.16';
+-------+-----------------+
| code | name_local |
+-------+-----------------+
| NO.16 | Sør-Trøndelag |
+-------+-----------------+
所以基本上我是想用这个查询加入这三个表,我做了一个特例说ON admin1.code = 'NO.16'
SELECT
city.geonameid as city_id,
city.name as city_name,
country.name as country_name,
admin1.name_local as admin1_code
FROM maxmind_cities1000 as city
INNER JOIN maxmind_countryinfo as country
ON city.iso_alpha2 = country.iso_alpha2
INNER JOIN maxmind_admin1_codes_ascii as admin1
ON admin1.code = 'NO.16'
WHERE city.name LIKE 'tron%' LIMIT 20;
但它给了我所有的行,而不仅仅是挪威特隆赫姆,所以我在这里做错了。我尝试切换到 LEFT JOIN 但得到相同的结果集。即使 maxmind_admin1_codes_ascii 表中没有匹配的行,我也希望城市显示在结果集中,管理代码的格式为 iso_aplha2 '。 admin1_code
+---------+------------------------+--------------+-----------------+
| city_id | city_name | country_name | admin1_code |
+---------+------------------------+--------------+-----------------+
| 1605268 | Tron | Thailand | Sør-Trøndelag |
| 8949073 | Tronca | Italy | Sør-Trøndelag |
| 3107444 | Tronchón | Spain | Sør-Trøndelag |
| 8859151 | Tronconal | Mexico | Sør-Trøndelag |
| 2821000 | Tröndel | Germany | Sør-Trøndelag |
| 3133880 | Trondheim | Norway | Sør-Trøndelag |
| 1252408 | Trongsa | Bhutan | Sør-Trøndelag |
| 2667264 | Trönninge | Sweden | Sør-Trøndelag |
| 6535739 | Trontano | Italy | Sør-Trøndelag |
| 2971582 | Tronville-en-Barrois | France | Sør-Trøndelag |
| 3165134 | Tronzano Lago Maggiore | Italy | Sør-Trøndelag |
| 3165133 | Tronzano Vercellese | Italy | Sør-Trøndelag |
+---------+------------------------+--------------+-----------------+
这是我的最终结果查询,但仍然不明白为什么当我只想要特殊情况“NO.16”时它会给出所有结果。如果我希望城市显示而不管 maxmind_admin1_codes_ascii 表中没有匹配的行,我应该如何构建我的查询?这就是我目前所拥有的
SELECT
city.geonameid as city_id,
city.name as city_name,
country.name as country_name,
admin1.name_local as admin1_code
FROM maxmind_cities1000 as city
INNER JOIN maxmind_countryinfo as country
ON city.iso_alpha2 = country.iso_alpha2
INNER JOIN maxmind_admin1_codes_ascii as admin1
ON admin1.code = CONCAT(city.iso_alpha2, '.', city.admin1_code)
WHERE city.name LIKE 'tron%' LIMIT 20;
+---------+------------------------+--------------+--------------------+
| city_id | city_name | country_name | admin1_code |
+---------+------------------------+--------------+--------------------+
| 1605268 | Tron | Thailand | Uttaradit |
| 8949073 | Tronca | Italy | Calabria |
| 3107444 | Tronchón | Spain | Aragon |
| 8859151 | Tronconal | Mexico | Puebla |
| 2821000 | Tröndel | Germany | Schleswig-Holstein |
| 3133880 | Trondheim | Norway | Sør-Trøndelag |
| 1252408 | Trongsa | Bhutan | Tongsa |
| 2667264 | Trönninge | Sweden | Halland |
| 6535739 | Trontano | Italy | Piedmont |
| 2971582 | Tronville-en-Barrois | France | Lorraine |
| 3165134 | Tronzano Lago Maggiore | Italy | Lombardy |
| 3165133 | Tronzano Vercellese | Italy | Piedmont |
+---------+------------------------+--------------+--------------------+
这给出了我想要的结果,但我认为我做的不对,因为对于特殊情况“NO.16”,结果出乎意料。希望有人能帮忙!
【问题讨论】:
-
ON子句应包含说明两个表如何相互关联的连接条件。如果你不这样做,你会得到一个完整的交叉乘积而不是相关行。
标签: mysql