【问题标题】:Delete all but one of duplicate rows in mysql删除mysql中除重复行之外的所有行
【发布时间】:2014-09-24 20:26:31
【问题描述】:

如何删除重复行,但前提是两个字段相等。例如.. 在下表中,只有一条 Atlanta 记录将被删除,因为不仅城市字段匹配,外键匹配也是如此。但是达拉斯不会因为外键不同而被删除。

+----+-----------------+----------+
| id | City            |     FK   |
+----+-----------------+----------+
| 1  | Los Angeles     |      2   |
| 2  | Dallas          |      5   |
| 3  | Dallas          |      8   |
| 4  | Atlanta         |      12  |
| 5  | Atlanta         |      12  |
| 6  | New York City   |      31  |
+----+-----------------+----------+

【问题讨论】:

  • 在给定的示例中,您只想删除重复的亚特兰大,而不是达拉斯(因为 FK 不同),对吗?
  • 是的,这是正确的@OscarPichi
  • 您是否通过以下任何答案解决了您的问题?

标签: mysql sql duplicates duplicate-removal


【解决方案1】:

如果 City 和 FK 相同,我们将获得最大 id,并删除除 City 和 FK 重复的最大 id 条目之外的所有其他条目

DELETE A
FROM TableA A join
     (SELECT MAX(id), City, FK
      from TableA
      group by City,FK
      having count(*) > 1
     ) AA
     on A.City = AA.City
     and A.FK = AA.FK
     and A.id < AA.id

【讨论】:

    【解决方案2】:

    试试这个:

        Delete from MyTable where id in
            (select T1.id from MyTable T1 where T1.id in
            (select T2.id from MyTable T2 where T2.city = T1.City and T2.fk= T1.fk) )
        and id not in (select MAX(id) from MyTable where id in 
           (select T1.id from MyTable T1 where T1.id in
            (select T2.id from MyTable T2 where T2.city = T1.City and T2.fk= T1.fk)))
    

    【讨论】:

      【解决方案3】:

      另一个问题here 有一个非常有趣的答案,您可能想尝试一下。可能这样的事情会为你做这项工作:

      ALTER IGNORE TABLE YourTableName ADD UNIQUE INDEX idx_name (City, FK);
      

      请注意:我建议之前进行备份。

      更新

      有一个带有 InnoDB 和 IGNORE 语句的bug。作为一种解决方法,您必须在 ALTER 命令之前运行 set session old_alter_table=1;

      这是Fiddle

      【讨论】:

        猜你喜欢
        • 2011-06-08
        • 1970-01-01
        • 1970-01-01
        • 2012-11-19
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-01-28
        相关资源
        最近更新 更多