版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/zimiao552147572/article/details/90140332
- mysql 安装、sql语法
- 一条sql语句完成MySQL去重留一
- mysql 事务、索引、锁、分区/分表、sql优化、查询优化
- mysql 安装配置使用、sql语法
- MySQL主键、创建索引、UNION 和 UNION ALL
DELETE
mygame
FROM
mygame,
(
SELECT
min(id) id,
game,
userid,
create_datatime
FROM
mygame
GROUP BY
game,
userid,
HAVING
count(*) > 1
) t2
WHERE
mygame.game = t2.game
and mygame.userid = t2.userid
and mygame.id > t2.id
第一步: 查询出重复记录形成一个集合(临时表t2),集合里是每种重复记录的最小ID
SELECT
min(id) id,
game,
userid,
create_datatime
FROM
mygame
GROUP BY
game,
userid,
HAVING
count(*) > 1
) t2
第二步:关联 判断重复基准的字段,根据条件,删除原表中id大于t2中id的记录
DELETE
mygame
FROM
mygame, t2
WHERE
mygame.game = t2.game
and mygame.userid = t2.userid
and mygame.id > t2.id
在使用mysql时,有时需要查询出某个字段不重复的记录,虽然mysql提供 有distinct这个关键字来过滤掉多余的重复记录只保留一条,
但往往只用它来返回不重复记录的条数,而不是用它来返回不重记录的所有值。
DELETE consum_record
FROM
consum_record,
(
SELECT
min(id) id,
user_id,
monetary,
consume_time
FROM
consum_record
GROUP BY
user_id,
monetary,
consume_time
HAVING
count(*) > 1
) t2
WHERE
consum_record.user_id = t2.user_id
and consum_record.monetary = t2.monetary
and consum_record.consume_time = t2.consume_time
AND consum_record.id > t2.id;
上面这条sql语句,仔细看一下,揣摩出思路也不难,大概也分为3步来理解:
(SELECT min(id) id, user_id, monetary, consume_time FROM consum_record GROUP BY user_id, monetary, consume_time HAVING count(*) > 1 ) t2
查询出重复记录形成一个集合(临时表t2),集合里是每种重复记录的最小ID
consum_record.user_id = t2.user_id and consum_record.monetary = t2.monetary and consum_record.consume_time = t2.consume_time
关联 判断重复基准的字段,根据条件,删除原表中id大于t2中id的记录