Mysql 使用联接从表中删除重复行

Mysql 使用联接从表中删除重复行,mysql,sql,duplicates,sql-delete,duplicate-removal,Mysql,Sql,Duplicates,Sql Delete,Duplicate Removal,我有两个表来包含国家的state(state_表)和city(city_表) 城市表具有state\u id,可以将其与state\u表关联 这两个表中都已包含数据 现在问题来了 城市表包含一个州内城市的多个条目。另一个城市可能也有可能没有相同的城市名称 e、 g.:cityone在city表中有5次出现在stateone中,2次出现在State2中 那么,我将如何编写一个查询来为每个州保留一个城市,并删除其余的城市呢 模式如下 CREATE TABLE IF NOT EXISTS `city_

我有两个表来包含国家的state(state_表)和city(city_表)

城市表具有state\u id,可以将其与state\u表关联

这两个表中都已包含数据

现在问题来了

城市表包含一个州内城市的多个条目。另一个城市可能也有可能没有相同的城市名称

e、 g.:cityone在city表中有5次出现在stateone中,2次出现在State2中

那么,我将如何编写一个查询来为每个州保留一个城市,并删除其余的城市呢

模式如下

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行

如果要删除具有相同
状态id
(重复记录)的重复城市,可以通过按
城市
状态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 |
欲了解更多信息,请参阅


若您发现这个查询太慢,可以创建临时表,并在其中存储子查询的输出,然后截断原始表并重新填充其内容。这是一个有点脏的解决方案,因为您必须设置自动增量列值。

请提供相同的示例数据。您的意思是表中有重复的数据,并且要删除所有重复的数据吗?请尝试编辑问题标题,以便总结您的问题。您尝试过我的答案吗?让我知道它在工作还是在工作not@SaharshShah由于表格很大,返回结果需要时间。我仍在等待…如果没有重复项,您的解决方案是否会删除行?也许你的意思是
不在
@samuil中-我更新了答案。查看我的,因为您正在使用子查询,所以加入
并检查
NULL
s有点多余。@samuil-是否成功运行?@hims056:非常感谢。拥抱:)它很有魅力[我把这个贴错了地方]
DELETE FROM city_table 
WHERE id NOT IN 
  (SELECT MIN(id) 
   FROM city_table 
   GROUP BY state_id, city)