使用join从表中删除重复的行

时间:2012-11-26 10:10:32

标签: mysql sql duplicates sql-delete duplicate-removal

我有两个表来包含国家/地区的州(state_table)和city(city_table)

city表正在使用state_id将其与state_table相关联

这两个表都已包含数据。

现在问题

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

例如:cityone将在city表中出现5次,其中stateone出现2次,state出现2次出现

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

架构如下

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

原始表有152,451行

2 个答案:

答案 0 :(得分:1)

如果您要删除具有相同state_id(重复记录)的重复城市,可以按citystate_id并使用MIN或{进行分组来实现{1}}功能:

在删除查询之前,您的表格看起来像

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;

See this SQLFiddle

有关详情,请参阅DELETE Syntax of MySQL.

答案 1 :(得分:-1)

DELETE FROM city_table 
WHERE id NOT IN 
  (SELECT MIN(id) 
   FROM city_table 
   GROUP BY state_id, city)

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