问题起因:如何查找数据库中重复的记录,并删除掉最老的那个记录?
查询语句有两个
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表的数据不会删除)