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

MySQL 中删除重复数据只保留一条_第1张图片
WechatIMG256.jpeg

场景

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

数据模型

  • half_demon 半妖表
id name weapon skill
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来判断。

  • 查询结果
id name weapon skill
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最小的记录。

  • 删除结果
id name weapon skill
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来判断。

  • 查询结果
id name weapon skill
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最小的记录。

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

你可能感兴趣的:(MySQL 中删除重复数据只保留一条)