MySQL根据某一个或者多个字段查找重复数据,并且保留某字段值最大的记录
程序员文章站
2022-03-07 10:48:42
...
转自:https://blog.csdn.net/sand_clock/article/details/74740567
问题场景
当系统没有处理好并发操作的情况下,操作人员同时操作一张表的情况下,数据库有可能被插入相同记录,这些会带来隐藏的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
);
- 1
- 2
- 3
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);
- 1
使用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
)
- 1
- 2
- 3
- 4
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
)
- 1
- 2
- 3
- 4
使用select语句查看结果如下图:
上一篇: 基于Redis的分布式服务限流方案
下一篇: php怎样获取文件的最后修改时间