【问题标题】:Remove Duplicate Records Except One Record删除除一条记录外的重复记录
【发布时间】:2012-02-26 10:24:16
【问题描述】:

我有一个包含多个重复记录的表,如下所示:

ID      Title
-----------------
1       Article A
2       Article A
3       Article B
4       Article C
5       Article A

在上述情况下,我需要所有重复的标题,只留下一个。

B 条和 C 条都可以。 我需要删除文章 A,除了一篇。

示例输出:

ID      Title
-----------------
1       Article A
3       Article B
4       Article C

注意:我不关心要保留或删除哪个 ID。我只想要一个记录。

假设我有大量具有重复标题的记录

有什么建议吗?

【问题讨论】:

    标签: mysql duplicate-removal


    【解决方案1】:
    DELETE 
       t1 
    FROM 
       tTable t1, tTable t2 
    WHERE 
       t1.fieldName = t2.fieldName AND t1.id > t2.id
    

    否则

    如下创建另一个表

    CREATE TABLE myTable_new (ID INT PRIMARY KEY, Title varchar(20))
    

    并将值添加为

    INSERT INTO myTable_new  (ID, Title) SELECT ID, DISTINCT Title FROM old_table
    

    考虑到old_table 是较早的表...

    【讨论】:

      【解决方案2】:

      这将始终保留 ID 最低的行 -

      DELETE t2
      FROM `table` t1
      INNER JOIN `table` t2
          ON t1.Title = t2.Title
          AND t1.ID < t2.ID
      

      【讨论】:

        【解决方案3】:
        DELETE FROM table WHERE Title = 'Article A' AND ID <> 1
        

        只需选择要保留的 ID。

        【讨论】:

        • 我怎么想不通...我想我已经筋疲力尽了...谢谢!
        • 假设我有大量具有重复标题的记录,我相信我会以某种方式需要子查询。
        • 我会处理表格中多次出现的标题,然后我会遍历结果集并清除不必要的行。
        • 如果我有一个新行作为6 Article B??
        • 必须每隔一段时间监视/检查数据库以删除重复项...
        【解决方案4】:

        Title 列上添加UNIQUE 约束,忽略重复键错误:

        ALTER IGNORE TABLE my_table ADD UNIQUE my_index (Title)
        

        当然,这样的约束也会防止以后再往表中添加重复;如果您不希望将来强制执行此类约束,您可以在创建约束后简单地删除它:

        ALTER TABLE my_table DROP INDEX my_index
        

        【讨论】:

          猜你喜欢
          • 2011-08-18
          • 2018-02-17
          • 1970-01-01
          • 2016-10-24
          • 2021-03-17
          • 1970-01-01
          • 1970-01-01
          • 2015-11-18
          相关资源
          最近更新 更多