2009-11-25 51 views
16

如何刪除此設置中的重複項?Mysql重複行(使用2列檢測到重複)

id A  B 
---------------- 
1  apple 2 
2  orange 1  
3  apple 2 
4  apple 1 

在這裏我想刪除(蘋果,2)發生兩次。身份證號碼是唯一的。如果不是,我會使用DISTINCT關鍵字。我可以做些什麼如何使列A和B的關鍵,然後使用DISTINCT關鍵字來獲得我所需要的?非常感謝您的回覆。

+0

再次感謝大家的回覆。我想現在我有一個好主意如何繼續。 – jason

回答

17
delete from myTable 
where id not in 
(select min(id) 
from myTable 
group by A, B) 

即即括號中的選項返回每個A和B分組的第一個ID;刪除不在此集合中的所有id將刪除A-plus-B組合的所有出現,這些組合是「第一次出現」的「後續」。

編輯:這個語法似乎是有問題的:見bug報告:

http://bugs.mysql.com/bug.php?id=5037

可能的解決方法是做到這一點:

delete from myTable 
where id not in 
(
     select minid from 
     (select min(id) as minid from myTable group by A, B) as newtable 
) 
+0

不錯。非常好。 –

+0

這是如何執行相對於我的答案?我不是足夠的一個數據庫大師來分析它... –

+0

不錯.. 這將刪除行在哪裏id = 3,而不是在哪裏id在1,3 –

1
DELETE FROM fruit_table FT1 
WHERE EXISTS 
(
    SELECT * FROM fruit_table FT2 
    WHERE FT2.fruit_name_column = FT1.fruit_name_column 
    AND FT2.fruit_integer_column = FT1.fruit_integer_column 
    AND FT2.id <> FT1.id 
) 

這是假設你不不關心哪些重複記錄被刪除。

+0

MySQL中對我的錯誤 - 「你的SQL語法錯誤;檢查與你的MySQL服務器版本相對應的手冊,在'FT1'附近使用正確的語法 – Utkanos

0

你可以使用一個臨時表與你想要的數據:

insert into temp_table 
select min(id), A, B 
group by A, B 
0

我不完全知道你是問這裏。如果你不想要A和B列的重複,那麼就做你剛剛提到的SELECT DISTINCT A, B FROM XXX。也許你可以發佈一個你想看到的結果類型的例子。

+0

我想」group by「是我所缺少的,其他職位已經澄清了這一點。 – jason

1
DELETE 
FROM mytable 
USING mytable, mytable AS vtable 
WHERE vtable.id > mytable.id 
AND mytable.A = vtable.A 
AND mytable.A = vtable.A 
+0

MySQL中的錯誤 - 「您的SQL語法錯誤;請查看與您的MySQL服務器版本相對應的手冊,以便在'tbl USING ...'附近使用正確的語法」 – Utkanos

6

又一個(來自http://labs.creativecommons.org/2010/01/12/removing-duplicate-rows-in-mysql/)。然後添加一個唯一索引中刪除:

ALTER IGNORE TABLE mytable ADD UNIQUE INDEX tmpindex (A,B); 
ALTER TABLE mytable DROP INDEX tmpindex; 

IGNORE關鍵字是一個MySQL擴展,使得它丟棄違反UNIQUE關鍵字,而不是僅僅失敗的行。

+1

不適用於MySQL –