从表中删除重复的行与加盟(Remove duplicate rows from table with

2019-07-04 02:59发布

我有两个表包含国家的状态(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行

Answer 1:

如果你想删除重复的城市,同样state_id (重复记录),你可以做到这一点,通过将它们分组citystate_id和使用MINMAX功能:

删除查询之前,你的表是看起来像

| 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的句法。



Answer 2:

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

如果你会发现这个查询太慢了,你可以创建临时表,并在它的子查询的店输出,然后截断原始表和填充它的内容。 这是一个有点脏的解决方案,因为你必须设置AUTO_INCREMENT列的值。



文章来源: Remove duplicate rows from table with join