左连接提供更多结果

时间:2013-03-23 23:12:03

标签: mysql join left-join

我有这个问题:

SELECT wc.city, wc.country_id, wc.latitude, wc.longitude FROM 
world_cities wc
-- left join states s on wc.country_id = s.country_id
where wc.city = 'rosemount'

我得到6个结果(我想要的),如果我取消评论第3行,我得到150个结果。为什么当我取消评论第3行我得到更多结果时,我不应该只得到6吗?我觉得我在这里错过了一些东西......

mysql> describe states;
+------------+---------------------+------+-----+---------+----------------+
| Field      | Type                | Null | Key | Default | Extra          |
+------------+---------------------+------+-----+---------+----------------+
| state_id   | int(10) unsigned    | NO   | PRI | NULL    | auto_increment |
| country_id | tinyint(3) unsigned | YES  |     | NULL    |                |
| state_name | char(15)            | YES  |     | NULL    |                |
+------------+---------------------+------+-----+---------+----------------+
3 rows in set (0.00 sec)

世界城市

mysql> describe world_cities;
+-------------+---------------------+------+-----+---------+----------------+
| Field       | Type                | Null | Key | Default | Extra          |
+-------------+---------------------+------+-----+---------+----------------+
| city_id     | int(10) unsigned    | NO   | PRI | NULL    | auto_increment |
| state_id    | int(11)             | YES  |     | 0       |                |
| country_id  | tinyint(3) unsigned | YES  | MUL | NULL    |                |
| country     | char(2)             | YES  |     | NULL    |                |
| city        | char(60)            | YES  | MUL | NULL    |                |
| accent_city | char(60)            | YES  |     | NULL    |                |
| region      | int(11)             | YES  |     | NULL    |                |
| population  | int(11)             | YES  |     | NULL    |                |
| latitude    | decimal(9,6)        | YES  |     | NULL    |                |
| longitude   | decimal(9,6)        | YES  |     | NULL    |                |
+-------------+---------------------+------+-----+---------+----------------+
9 rows in set (0.01 sec)

修改
我现在运行它,它很好地更新了world_cities表中的state_id。

update world_cities wc 
left join zipcodes z on wc.city = z.city 
left join cities c on z.state = c.city_name
left join states s on z.state = s.state_name 
set wc.state_id = s.state_id 
where wc.country_id = 236
and abs(round(z.lat, 2) - round(wc.latitude, 2)) between 0 and 1
and abs(round(z.log, 2) - round(wc.longitude, 2)) between 0 and 1;

2 个答案:

答案 0 :(得分:1)

world_cities中有6条记录,城市为“rosemount”,但您有多个状态,这些状态属于与这些城市相同的国家/地区。例如,美国底特律MI与美国所有其他州是同一个国家。所以我希望在我的例子中有300 = 6 * 50的东西。

您很可能想要加入其他条件:wc.country_id = s.country_id AND wc.state_id = s.state_id。查看您的架构,无法确定城市所属的州。您需要创建一个world_cities.state_id列。

答案 1 :(得分:1)

我认为你正在加入错误的领域。试试这个:

SELECT wc.city, wc.country_id, wc.latitude, wc.longitude FROM 
world_cities wc
-- left join states s on wc.state_id = s.state_id
where wc.city = 'rosemount'

如果某个城市位于美国,那么您可能有50个(或57个)符合国家/地区ID的州。