mysql - 如何识别和删除或更新 Mysql 表中的重复行

标签 mysql sql

<分区>

由于最近的一个错误,我们有一个包含多个重复条目的表格。
我想要做的是找到并理想地删除(或者可能只是更新)重复的行。

PersonGroup
-----------
id
personId
groupId
type
primary
value

select count(*) cnt from personGroup pg where type="FOO" group by personId having cnt > 1;

产生近 20k 行。应该是 0。对于任何给定的 type,每个 personId 都应该只有一个条目。

我可以编写一个程序来解决这个问题,但在我这样做之前,我想知道是否有一个纯 SQL 解决方案。

最佳答案

检查此查询。我认为它非常简单但有效:

delete from persongroup
 where id not in (
    select max(id)
      from persongroup
     group by PersonId);

如果你的表太大可以考虑用inner join来写

 delete persongroup
   from persongroup
  inner join (
     select max(id) as lastId, personId
       from personGroup
      group by personId
     having count(*) > 1) dup on dup.personId = persongroup.personId
  where persongroup.id < dup.lastId;

以上查询未经测试

关于mysql - 如何识别和删除或更新 Mysql 表中的重复行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53752029/

相关文章:

php - (我的)带有 MAX 和 LEFT JOIN 的 SQL 查询

html - 在 SSRS 报告中显示 HTML 页面

sql - 如何将 "weights"添加到MySQL表中并根据这些选择随机值?

MySQL - 返回当前日期介于开始日期和结束日期之间的行

php - 如何在php中获取好友列表?

mysql - 用户 'root' @'external ip' 的访问被拒绝(使用密码 : YES)

mysql - 使用mysql插入时更新源表

mysql - 现在()与 GetDate()

php - 如何在mysql和php中使用日期选择时间戳

javascript - MySQL 和 AJAX,可以在其中之一中运行,但不能在另一个中运行