2012-08-08 93 views
1

對不起,我意識到我的標題很混亂。請讓我解釋一下。刪除有兩個重複字段但沒有重複ID的MySQL行

我有一個看起來像這樣的數據庫:

| i | a | b | 
| 1 | 5 | 8 | 
| 2 | 3 | 3 | 
| 3 | 3 | 6 | 
| 4 | 5 | 8 | 
| 5 | 1 | 1 | 
| 6 | 3 | 3 | 

哪裏i是ID和ab另外兩個領域。如上所示,ID 2和ID 6都有a = 3b = 3。 ID 1和ID 4也是如此,對於a有5個,對於b有5個。即使身份證號碼不同,我仍然認爲這些行是重複的,並希望所有行都被刪除。無論哪一個都沒關係,ID號碼也不必爲彌補差距而改變(但我並不反對)。

我將很高興與得到上面的例子像這樣的查詢:

| i | a | b |   | i | a | b | 
| 3 | 3 | 6 |   | 1 | 5 | 8 | 
| 4 | 5 | 8 | or | 2 | 3 | 3 | 
| 5 | 1 | 1 |   | 3 | 3 | 6 | 
| 6 | 3 | 3 |   | 5 | 1 | 1 | 

不要猶豫提前要求更多的細節和感謝!

回答

3
delete from your_table 
where i not in 
(
    select * from 
    (
     select min(i) 
     from your_table 
     group by a, b 
    ) x 
) 

MySQL無法從它正在從中選擇的表中刪除。這就是爲什麼我做了一個subquery的選擇與select * from() x

+0

太漂亮了!謝謝,這個工作非常出色。我永遠在你的債務。 – 2012-08-08 19:25:23

2

首先。清理完表後,在列a和b上放置一個備用密鑰索引,以確保更多重複記錄不會添加到表中......但是,如上所述,刪除最後輸入的重複項需要

Delete TableName 
From Tablename t 
Where id <> (Select Min(id) From TableName 
      Where a = t.a and b = t.b) 

要刪除所有,但最後輸入的重複數據刪除,更改最低到最高

+0

您的意思是「唯一」鍵而不是「替代」鍵嗎? – 2012-08-08 19:29:25

+0

@marcus,不,替代鍵用於表示除「主」鍵之外的另一個鍵......工作「鍵」本身意味着唯一性。 – 2012-08-08 19:38:39