◉◡◉ 您好,欢迎到访伊成个人站!

MySQL中按字段查询重复数据

背景

在项目开发中,难免会遇到xx表有重复数据(脏数据),导致的原因有很多,可能是测试人员一直在添加同一条数据,也可能是编写的功能本身就存在bug(没有对数据做重复数据校验)等。

既然是难免的情况,那如何处理呢?

根据一个字段查询重复数据

举个栗子,有个用户表测试小姐姐拼命的创建同一条数据插入到用户表。
那么在用户表中就会存在相同用户名的多条数据,根据 用户名 查询重复数据的SQL如下:

1
SELECT userName from tb_user GROUP BY userName HAVING count(*) > 1;

如果查询出来重复数据只需要保留一条,那就得把多余的数据删除即可,对应SQL如下:

1
DELETE FROM tb_user WHERE userId NOT IN ( SELECT MAX( userId ) AS maxid FROM tb_user GROUP BY userName);

这里是根据 用户名分组保留用户ID最大的那条数据,其它的都删掉!
具体保留哪条数据,各位小伙伴可自行决定~

根据多个字段查询重复数据

在举个栗子,在这个用户表中 用户名和用户类型 都重复的需要查询出来,对应的SQL如下:

1
SELECT * FROM tb_user GROUP BY userName,userType HAVING count(*) > 1;

根据多个字段查询,保留一条数据,删除多余数据SQL如下:

方法一:

1
DELETE FROM tb_user WHERE userId NOT IN ( SELECT MAX( userId ) AS maxid FROM tb_user GROUP BY userName,userType);

方法二:

1
SELECT nameAndType from (SELECT CONCAT(userName,userType) as nameAndType from tb_user) tt GROUP BY nameAndType HAVING count(nameAndType) > 1;

方法三:

1
DELETE FROM tb_user WHERE userId NOT IN (SELECT maxid from (SELECT MAX(userId) as maxid, CONCAT(userName,userType) as nameAndType from tb_user GROUP BY nameAndType) t);

方法一中删除多余重复数据和上面文章中的思路是一致的,方法二和方法三的思路是利用CONCAT函数。

以上,如果你开发过程中遇到同样问题,可以使用上面的SQL尝试一下!

The end…

支付宝打赏 微信打赏