2011-05-25 53 views
2

我使用這個SQL語句查找重複記錄:使用SQL找到重複的記錄,並以相同的操作刪除

SELECT id, 
     user_id, 
     activity_type_id, 
     source_id, 
     source_type, 
     COUNT(*) AS cnt 
    FROM activities 
GROUP BY id, user_id, activity_type_id, source_id, source_type 
    HAVING COUNT(*) > 1 

不過,我想不僅可以找到,但在相同的操作刪除。

+1

刪除什麼,確切地說?所有這些,除了最早或最新? – 2011-05-25 03:27:03

+0

相關:http://stackoverflow.com/questions/6103212/how-do-i-delete-duplicate-rows-and-keep-the-first-row – 2011-05-25 03:37:53

+0

是否真的重複'id'字段,因爲您的GROUP BY建議? – pilcrow 2011-05-25 04:51:20

回答

1

delete from activities where id not in (select max(id) from activities group by ....)


感謝@OMG小馬和他的其他帖子在這裏被修改的解決方案(但不完全一樣)。我在這裏假設哪些特定的行未被刪除並不重要。另外假設是id是主鍵。

在我的示例中,我只是爲測試設置了一個額外的列name,但它可以通過GROUP BY子句輕鬆擴展到更多列。

DELETE a FROM activities a 
    LEFT JOIN (SELECT MAX(id) AS id FROM activities GROUP BY name) uniqId 
    ON a.id=uniqId.id WHERE uniqId.id IS NULL; 
+0

如果OP確實按照SELECT建議的那樣進行GROUPING BY'id',那麼他重複了ids,這不會將其刪除。 – pilcrow 2011-05-25 03:34:41

+0

錯誤#1093 - '你無法在FROM子句中指定更新的目標表'活動' – 2011-05-25 03:37:29

+0

@OMG對不起 - 我忘記了mysql是如何操作的。我會和它一起玩,看看會出現什麼。可能是一些臨時表? – 2011-05-25 03:53:51