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

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 刹那 兼光之巴 旋风阵
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。