MySQL數據庫根據一個或多個字段查詢重復數據


  系統在開發測試過程中出現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優化,希望可以能對大家有所幫助。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM