我有記錄的表,我想刪除所有重複記錄
DELETE FROM 'table'
WHERE 'field' IN
(
SELECT 'field' FROM 'table' GROUP BY 'field'
HAVING (COUNT('field')>1)
)
爲什麼這不正常嗎?
我有記錄的表,我想刪除所有重複記錄
DELETE FROM 'table'
WHERE 'field' IN
(
SELECT 'field' FROM 'table' GROUP BY 'field'
HAVING (COUNT('field')>1)
)
爲什麼這不正常嗎?
也許你可以用命令DISTINCT
來探索,以便只選擇基於字段的唯一記錄。
您可以使用基於唯一條目創建新表。 作爲示例...
CREATE TABLE nonDuplicates
SELECT DISTINCT * FROM yourTable group by field
這隻會起作用,因爲MySQL對GROUP BY的處理基本上是不正確的,並且允許這種無效的語法。但它最可能是最快的解決方案。 –
謝謝Peixe它工作得很好! – vdhmartijn
@vdhmartijn:請閱讀http://rpbouman.blogspot.de/2007/05/debunking-group-by-myths.html以瞭解*爲什麼*它在MySQL中工作以及爲什麼其他DBMS會拒絕該語句無效。 –
這給你不止一個結果: -
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
SELECT TOP 1不適用於我..仍然不能正常工作 – vdhmartijn
這是如何刪除任何東西的? –
首先獲得所有副本,並將它們存儲在陣列。
SELECT field
FROM `table`
GROUP BY field
HAVING COUNT('field') > 1
現在做你的PHP保存無論你想要一個結果,然後執行
DELETE
FROM `table`
WHERE field IN (your values) AND field != savedID
感謝您的反饋,但是我的目的是在沒有PHP的情況下工作SQL – vdhmartijn
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;
如果我沒有ID,是否還有辦法解決這個問題? – vdhmartijn
@vdhmartijn:如果你想刪除**所有**重複(至少保留一個),那麼你可以不使用ID。否則,請參閱peixe的答案。 –
感謝您幫助它現在工作! – vdhmartijn
您是否收到錯誤消息或查詢是否成功運行? –
wouldnt您的查詢刪除所有字段,包括重複?如果你有兩個重複的ID,你的IN()查詢將刪除這兩個。你不想保留至少一條記錄嗎? – GGio
mysql不允許你更新/刪除你選擇數據的表格。 –