2014-09-23 87 views
1

如何删除重复行,但只有在两个字段相同的情况下才能删除重复行。例如.. 在下表中,只有一个亚特兰大记录将被删除,因为不仅城市字段匹配而且外键匹配也是如此。但是由于外键不同,达拉斯不会被删除。删除mysql中除重复行之外的所有行

+----+-----------------+----------+ 
| id | City   |  FK | 
+----+-----------------+----------+ 
| 1 | Los Angeles  |  2 | 
| 2 | Dallas   |  5 | 
| 3 | Dallas   |  8 | 
| 4 | Atlanta   |  12 | 
| 5 | Atlanta   |  12 | 
| 6 | New York City |  31 | 
+----+-----------------+----------+ 
+0

在给定的例子中,你只想删除重复的亚特兰大,但不是达拉斯(因为FK是不同的),这是正确的吗? – 2014-09-23 17:08:57

+0

是的,这是正确的@OscarPichi – seanr 2014-09-23 17:21:25

+0

您是否用下面的答案解决了您的问题? – ForguesR 2014-09-24 17:52:37

回答

0

我们得到最大的ID的情况下,城市和FK是相同的,从最大ID条目,其中城市和FK重复的间隔删除所有其他条目

DELETE A 
FROM TableA A join 
    (SELECT MAX(id), City, FK 
     from TableA 
     group by City,FK 
     having count(*) > 1 
    ) AA 
    on A.City = AA.City 
    and A.FK = AA.FK 
    and A.id < AA.id 
0

试试这个:

Delete from MyTable where id in 
     (select T1.id from MyTable T1 where T1.id in 
     (select T2.id from MyTable T2 where T2.city = T1.City and T2.fk= T1.fk)) 
    and id not in (select MAX(id) from MyTable where id in 
     (select T1.id from MyTable T1 where T1.id in 
     (select T2.id from MyTable T2 where T2.city = T1.City and T2.fk= T1.fk))) 
0

另一个问题here有一个非常有趣的答案,你可能想尝试。可能像这样会为你做这项工作:

ALTER IGNORE TABLE YourTableName ADD UNIQUE INDEX idx_name (City, FK); 

请注意:我建议在进行备份之前。

更新

有一个bug与InnoDB和的忽略声明。作为解决方法,您必须在ALTER命令之前运行set session old_alter_table=1;

这是Fiddle