MySQL根据某一个或者多个字段查找重复数据,并且保留某字段值最大的记录

来源:互联网 发布:ubuntu 等待安装 卡住 编辑:程序博客网 时间:2024/06/07 10:24

问题场景

当系统没有处理好并发操作的情况下,操作人员同时操作一张表的情况下,数据库有可能被插入相同记录,这些会带来隐藏的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语句查看结果如下图:
这里写图片描述

阅读全文
0 0
原创粉丝点击