我有两个表包含国家的状态(state_table),市(city_table)
该市表已经STATE_ID与state_table它有关
这两个表都已经有在它的数据。
现在的问题
市表中包含一个国中之城的多个条目。 而另一城市可能会或可能不会有相同的城市名称,以及
例如:城市之一将有5发生在城市表stateone和2发生与statetwo
所以,我怎么会写一个查询,以保持一个城市的每一个状态,并删除其余?
架构如下
CREATE TABLE IF NOT EXISTS `city_table` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`state_id` int(11) NOT NULL,
`city` varchar(25) NOT NULL,
PRIMARY KEY (`id`)
) ENGINE=MyISAM DEFAULT CHARSET=latin1 AUTO_INCREMENT=1 ;
CREATE TABLE IF NOT EXISTS `state_table` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`state` varchar(15) NOT NULL,
`country_id` smallint(5) NOT NULL,
PRIMARY KEY (`id`)
) ENGINE=MyISAM DEFAULT CHARSET=latin1 AUTO_INCREMENT=1 ;
这是示例数据
id state_id city
1 1 city_one
2 1 city_two
3 1 city_one
4 1 city_two
5 2 city_one
6 3 city_three
7 3 city_one
8 3 city_three
9 4 city_four
10 4 city_five
原始表有152451行
如果你想删除重复的城市,同样state_id
(重复记录),你可以做到这一点,通过将它们分组city
和state_id
和使用MIN
或MAX
功能:
删除查询之前,你的表是看起来像
| ID | STATE_ID | CITY |
------------------------------
| 1 | 1 | city_one |
| 2 | 1 | city_two |
| 3 | 1 | city_one |
| 4 | 1 | city_two |
| 5 | 2 | city_one |
| 6 | 3 | city_three |
| 7 | 3 | city_one |
| 8 | 3 | city_three |
| 9 | 4 | city_four |
| 10 | 4 | city_five |
您可以使用下面的查询来删除重复记录:
DELETE city_table
FROM city_table
LEFT JOIN
(SELECT MIN(id) AS IDs FROM city_table
GROUP BY city,state_id
)A
ON city_table.ID = A.IDs
WHERE A.ids IS NULL;
应用上述查询您的表看起来像后:
| ID | STATE_ID | CITY |
------------------------------
| 1 | 1 | city_one |
| 2 | 1 | city_two |
| 5 | 2 | city_one |
| 6 | 3 | city_three |
| 7 | 3 | city_one |
| 9 | 4 | city_four |
| 10 | 4 | city_five |
看到这个SQLFiddle
欲了解更多请参见DELETE
的MySQL的句法。
DELETE FROM city_table
WHERE id NOT IN
(SELECT MIN(id)
FROM city_table
GROUP BY state_id, city)
如果你会发现这个查询太慢了,你可以创建临时表,并在它的子查询的店输出,然后截断原始表和填充它的内容。 这是一个有点脏的解决方案,因为你必须设置AUTO_INCREMENT列的值。