MySQL 中删除重复数据只保留一条

558 阅读2分钟

本文已参与「新人创作礼」活动,一起开启掘金创作之路。

image.png

场景

在许多条记录里,存在着些相同的记录,使用SQL语句,删除掉重复项只保留一条。

数据模型

  • half_demon 半妖表
idnameweaponskill
1永远菊十文字苍龙破
2诸叶弓箭苍穹箭雨
3诸叶俱利伽罗丸红龙破
4刹那兼光之巴旋风阵
5刹那兼光之巴宿蛾之月

单字段示例

  • 查询语句
SELECT
	id,name 
FROM
	half_demon 
WHERE
	name IN ( SELECT name FROM half_demon GROUP BY name HAVING count( name ) > 1 )

查找表中多余的重复记录,重复记录是根据单个字段name来判断。

  • 查询结果
idnameweaponskill
2诸叶弓箭苍穹箭雨
3诸叶俱利伽罗丸红龙破
4刹那兼光之巴旋风阵
5刹那兼光之巴宿蛾之月
  • 删除语句
DELETE 
FROM
	half_demon 
WHERE
	id NOT IN ( SELECT hd.minid FROM ( SELECT MIN( id ) AS minid FROM half_demon GROUP BY name ) hd )

删除表中多余的重复记录,重复记录是根据单个字段name来判断,只留有id最小的记录。

  • 删除结果
idnameweaponskill
1永远菊十文字苍龙破
2诸叶弓箭苍穹箭雨
4刹那兼光之巴旋风阵

多字段示例

  • 查询语句
SELECT
    id,
    name,
    weapon 
FROM
    half_demon a 
WHERE
    ( a.name, a.weapon ) IN ( SELECT name, weapon FROM half_demon GROUP BY name, weapon HAVING count( * ) > 1 )

查找表中多余的重复记录,重复记录是根据多个字段name、weapon来判断。

  • 查询结果
idnameweaponskill
4刹那兼光之巴旋风阵
5刹那兼光之巴宿蛾之月
  • 删除语句
DELETE 
FROM
    half_demon 
WHERE
    ( name, weapon ) IN (
SELECT
    t.name,
    t.weapon 
FROM
    ( SELECT name, weapon FROM half_demon GROUP BY name, weapon HAVING count( 1 ) > 1 ) t 
    ) 
    AND id NOT IN ( SELECT hd.minid FROM ( SELECT min( id ) AS minid FROM half_demon GROUP BY name, weapon HAVING count( 1 ) > 1 ) hd )

删除表中多余的重复记录,重复记录是根据多个字段name、weapon来判断,只留有id最小的记录。

  • 删除结果
idnameweaponskill
1永远菊十文字苍龙破
2诸叶弓箭苍穹箭雨
3诸叶俱利伽罗丸红龙破
4刹那兼光之巴旋风阵