欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

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

程序员文章站 2022-03-07 10:48:42
...

转自:https://blog.csdn.net/sand_clock/article/details/74740567

问题场景

当系统没有处理好并发操作的情况下,操作人员同时操作一张表的情况下,数据库有可能被插入相同记录,这些会带来隐藏的bug。

解决思路一

解决并发操作的冲突。

解决思路二

对数据库(MySQL)某张表去重,首先确定你的业务是否允许重复,不允许你重复的话可以建立唯一索引和联合唯一索引来保证记录不重复,但如果出现了重复记录,怎么办?请看下文。

情况一:对一个字段查找重复记录

表数据: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

MySQL根据某一个或者多个字段查找重复数据,并且保留某字段值最大的记录
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语句查看结果如下图:
MySQL根据某一个或者多个字段查找重复数据,并且保留某字段值最大的记录

情况二:对多个字段查找重复记录(这里以2个为例)

表数据:
MySQL根据某一个或者多个字段查找重复数据,并且保留某字段值最大的记录
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

MySQL根据某一个或者多个字段查找重复数据,并且保留某字段值最大的记录
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语句查看结果如下图:
MySQL根据某一个或者多个字段查找重复数据,并且保留某字段值最大的记录