如何查找数据库中重复的记录,并删除掉最老的那个记录?

170 阅读2分钟

问题起因:如何查找数据库中重复的记录,并删除掉最老的那个记录?

查询语句有两个

SELECT ku.wechat_user_id , COUNT( ku.wechat_user_id)
FROM users ku
GROUP BY ku.wechat_user_id
HAVING COUNT( ku.wechat_user_id) > 1
ORDER BY COUNT( ku.wechat_user_id);

详细列表

select * from users ou
where (select count(*) from users inr
where inr.wechat_user_id = ou.wechat_user_id) > 1

如何删除?需要用的USING


DELETE
FROM [YOUR TABLE] A USING [YOUR TABLE AGAIN] B
WHERE A.wechat_user_id=B.wechat_user_id AND A.data_consent_timestamp < B.data_consent_timestamp;

结论:A 连B表,根据B表的条件,删除A表的数据(B表的数据不会删除)

什么是USING?【来自网友】

百度后发现只有USING()函数的用法,并没有单独的USING关键词的使用。

mysql中using的用法为: using()用于两张表的join查询,要求using()指定的列在两个表中均存在,并使用之用于join的条件。

示例:
select a.*, b.* from a left join b using(colA);
等同于:
select a.*, b.* from a left join b on a.colA = b.colA;

根据SQL猜测这条语句的主要目的是:A 连B表,根据B表的条件,删除A表的数据(B表的数据不会删除)

验证:

新建student表(id,姓名,性别)

新建socre表(id,成绩,学生id)

操作1:删除成绩为90的学生信息(A 连B表,根据B表的条件,删除A表的数据)

按照自己想法写的SQL:

DELETE FROM student t LEFT JOIN score s ON t.id = s.st_id WHERE s.score = 90;

发现语句报错(可能是自己本身SQL有问题,或者本来也不支持这样的操作):

模仿着公司的代码写SQL:

DELETE FROM  t USING student t ,score s WHERE t.id = s.st_id AND s.score = 90;

发现执行成功(Affected rows: 1):

1、score表数据没有删除

2、成绩为90的student信息删除了

再次验证:

操作2:删除score表中,性别为‘m’的数据。

SQL:

DELETE FROM s USING student t,score s WHERE t.id = s.st_id AND t.sex ='m';

执行后发现性别为m的所有数据被删除了:

因此验证:A 连B表,根据B表的条件,删除A表的数据(B表的数据不会删除)