1. 程式人生 > >MySQL根據某一個或者多個欄位查詢重複資料,並且保留某欄位值最大的記錄

MySQL根據某一個或者多個欄位查詢重複資料,並且保留某欄位值最大的記錄

問題場景

當系統沒有處理好併發操作的情況下,操作人員同時操作一張表的情況下,資料庫有可能被插入相同記錄,這些會帶來隱藏的bug。

解決思路一

解決併發操作的衝突。

解決思路二

對資料庫(MySQL)某張表去重,首先確定你的業務是否允許重複,不允許你重複的話可以建立唯一索引和聯合唯一索引來保證記錄不重複,但如果出現了重複記錄,怎麼辦?請看下文。

情況一:對一個欄位查詢重複記錄

表資料:這裡寫圖片描述
a. 首先根據sample_code欄位找到重複記錄

SELECT * FROM tb_table WHERE sample_code IN(
SELECT sample_code FROM
tb_table GROUP BY sample_code HAVING COUNT(sample_code) > 1 );

這裡寫圖片描述
b. 刪除重複記錄,只保留id欄位值最大的記錄

delete from tb_table where id not in (select maxid from (select max(id) as maxid from tb_table group by sample_code) b);

使用select語句檢視結果如下圖:
這裡寫圖片描述

情況二:對多個欄位查詢重複記錄(這裡以2個為例)

表資料:
這裡寫圖片描述
a. 首先根據name和code欄位找到重複記錄

SELECT
* from (SELECT *, CONCAT(name,code) as nameAndCode from tb_table) t WHERE t.nameAndCode in ( SELECT nameAndCode from (SELECT CONCAT(name,code) as nameAndCode from tb_table) tt GROUP BY nameAndCode HAVING count(nameAndCode) > 1 )

這裡寫圖片描述
b. 刪除重複記錄,只保留id欄位值最大的記錄

DELETE from tb_table WHERE id not in
( SELECT maxid from (SELECT MAX(id) as maxid, CONCAT(name,code) as nameAndCode from tb_table GROUP BY nameAndCode) t )

使用select語句檢視結果如下圖:
這裡寫圖片描述