2013-01-31 180 views
5

可能重複:
How to delete duplicate rows with SQL?如何刪除重複記錄SQL

我有記錄的表,我想刪除所有重複記錄

DELETE FROM 'table' 
WHERE 'field' IN 
(
SELECT 'field' FROM 'table' GROUP BY 'field' 
HAVING (COUNT('field')>1) 
) 

爲什麼這不正常嗎?

+0

您是否收到錯誤消息或查詢是否成功運行? –

+1

wouldnt您的查詢刪除所有字段,包括重複?如果你有兩個重複的ID,你的IN()查詢將刪除這兩個。你不想保留至少一條記錄嗎? – GGio

+2

mysql不允許你更新/刪除你選擇數據的表格。 –

回答

5

也許你可以用命令DISTINCT來探索,以便只選擇基於字段的唯一記錄。

您可以使用基於唯一條目創建新表。 作爲示例...

CREATE TABLE nonDuplicates 
SELECT DISTINCT * FROM yourTable group by field 
+1

這隻會起作用,因爲MySQL對GROUP BY的處理基本上是不正確的,並且允許這種無效的語法。但它最可能是最快的解決方案。 –

+0

謝謝Peixe它工作得很好! – vdhmartijn

+1

@vdhmartijn:請閱讀http://rpbouman.blogspot.de/2007/05/debunking-group-by-myths.html以瞭解*爲什麼*它在MySQL中工作以及爲什麼其他DBMS會拒絕該語句無效。 –

1

這給你不止一個結果: -

SELECT field FROM `table` 
GROUP BY field 
HAVING (COUNT('field)>1 

嘗試到chenge此:

SELECT TOP 1 field 
FROM `table` 
GROUP BY field 
HAVING (COUNT(field)>1 
+0

SELECT TOP 1不適用於我..仍然不能正常工作 – vdhmartijn

+0

這是如何刪除任何東西的? –

0

首先獲得所有副本,並將它們存儲在陣列。

SELECT field 
FROM `table` 
GROUP BY field 
HAVING COUNT('field') > 1 

現在做你的PHP保存無論你想要一個結果,然後執行

DELETE 
FROM `table` 
WHERE field IN (your values) AND field != savedID 
+0

感謝您的反饋,但是我的目的是在沒有PHP的情況下工作SQL – vdhmartijn

0

MySQL有插入一個子一個非常討厭的限制,即不能使用正在更新/刪除的表/ -選擇。

但是,您可以通過加入要刪除的表(而不是使用子選擇)來解決此問題。

假設你有一種獨特的標識符在表中(我假設在下面的語句列id):

DELETE d 
FROM table_with_duplicates d 
JOIN ( 
    SELECT min(id) as min_id, field 
    FROM table_with_duplicates 
    GROUP BY field 
) keep ON keep.field = d.field 
     AND keep.min_id <> d.id; 

這將讓一行每個副本的(具有洛斯值在id列中)。

如果要刪除全部重複行(不保留至少一個),只需刪除AND keep.min_id <> d.id條件。

編輯

如果沒有唯一列,但要刪除所有重複(不保持至少一個排),那麼你可以使用:

DELETE d 
FROM table_with_duplicates d 
JOIN ( 
    SELECT field 
    FROM table_with_duplicates 
    GROUP BY field 
    HAVING count(*) > 1 
) del ON del.field = d.field; 
+0

如果我沒有ID,是否還有辦法解決這個問題? – vdhmartijn

+0

@vdhmartijn:如果你想刪除**所有**重複(至少保留一個),那麼你可以不使用ID。否則,請參閱peixe的答案。 –

+0

感謝您幫助它現在工作! – vdhmartijn