Mysql

使用 group by 和 count 刪除重複項

  • November 20, 2020

轉換以下查詢的最快方法是什麼:

SELECT COUNT(*) as c FROM tbl_fields
WHERE fieldnotes IS NULL
GROUP BY fieldno,fieldserial,id,fielddate,fieldsid 
HAVING COUNT(*) > 1;

… 到一個將刪除重複記錄?該表沒有任何主鍵並且包含數百萬個條目。

根據您的查詢,您在子句fieldno,fieldserial,id,fielddate,fieldsid中具有唯一性規則。GROUP BY

你可以試試這個:

CREATE TABLE tbl_fields_unique LIKE tbl_fields;
ALTER TABLE tbl_fields_unique
ADD UNIQUE KEY unq (fieldno,fieldserial,id,fielddate,fieldsid);
INSERT IGNORE INTO tbl_fields_unique
SELECT * FROM tbl_fields;
ALTER TABLE tbl_fields RENAME tbl_fields_old;
ALTER TABLE tbl_fields_unique RENAME tbl_fields;

這將過濾具有重複fieldno,fieldserial,id,fielddate,fieldsid欄位的行。查看新表。tbl_fields_unique一旦您對錶格的內容感到滿意,請執行以下操作:

ALTER TABLE tbl_fields RENAME tbl_fields_old;
ALTER TABLE tbl_fields_unique RENAME tbl_fields;

試一試 !!!

如果您可以添加一個 ID 列並為每條記錄填充一個唯一值,那麼您應該能夠執行如下查詢

DELETE FROM tbl_fields
WHERE <New ID Column> IN (SELECT MAX(<New ID Column>)
                           FROM tbl_fields
                          WHERE fieldnotes IS NULL 
                         GROUP BY fieldno,fieldserial,id,fielddate,fieldsid  
                        HAVING COUNT(*) > 1)

這將刪除重複項,然後您可以刪除

如果您有足夠的重複項,超出了 IN 語句的 SQL 限制,那麼您可以將 IN 語句的 ID 值插入到臨時表中並針對該表執行存在。

引用自:https://dba.stackexchange.com/questions/9602