2014-09-23 171 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