系統在開發測試過程中出現bug,比如並發操作沒有處理好,數據庫中往往會插入重復數據,這些臟數據經常會導致各種問題。bug可以修改,但是數據往往也要處理,處理SQL如下:
1、根據一個字段查找重復數據
比如,User表中的userName需要保持唯一,查詢重復數據的語句如下:
SELECT userName from `User` GROUP BY userName HAVING count(*) > 1;
如果要刪除重復數據,則根據userName分組獲取最大或最小id,然后刪除其他數據即可,如下:
DELETE FROM USER WHERE userId NOT IN ( SELECT MAX( userId ) AS maxid FROM `User` GROUP BY userName);
2、根據多個字段查找重復數據
比如,User表中的userName、loginType需要保持數據的唯一性,查詢重復數據的語句如下:
SELECT * FROM `User` GROUP BY userName,loginType HAVING count( * ) > 1
如果要保證數據的唯一性,則分組后查找最大或最小id然后刪除其他數據,如下:
DELETE FROM USER WHERE userId NOT IN ( SELECT MAX( userId ) AS maxid FROM `User` GROUP BY userName,loginType );
另外還有一種方法,就是用CONCAT函數把多個字段串聯然后查找出需要保留的id,其他數據刪除即可,查詢語句如下:
SELECT nameAndType from (SELECT CONCAT(userName,loginType) as nameAndType from User) tt GROUP BY nameAndType HAVING count(nameAndType) > 1;
刪除語句如下:
DELETE FROM USER WHERE userId NOT IN (SELECT maxid from (SELECT MAX(userId) as maxid, CONCAT(userName,loginType) as nameAndType from User GROUP BY nameAndType) t);
以上就是樓主的解決辦法,只求解決問題,沒有進行SQL優化,希望可以能對大家有所幫助。