【问题标题】:DELETE all duplicate topics with few conditions删除所有条件很少的重复主题
【发布时间】:2026-01-25 09:20:03
【问题描述】:

我正在尝试创建将删除所有重复标题但必须在以下条件下删除重复标题的 sql:

  • 必须只删除具有相同object_id的重复项
  • 必须只保留最新的记录(最大的topic_id)(topic_id是每个topic AI的唯一id)

到目前为止,我已经完成了(使用 select... 进行测试)

SELECT topic_id,object_id,title,url,date 
FROM topics GROUP BY title 
HAVING ( COUNT(title) > 1) 
ORDER BY topic_id DESC

但不符合条件。
我正在使用 mysql。

【问题讨论】:

    标签: mysql sql duplicates sql-delete


    【解决方案1】:

    这将删除所有重复的 object_id 记录,保存具有最高 topic_id 的记录。

    delete from topics outer where exists
    (
        select 1 from topics inner where 
            outer.object_id = inner.object_id AND 
            inner.topic_id  < outer.topic_id
    )
    

    【讨论】:

    • MySQL 中不起作用。将导致Error Code: 1093 You can't specify target table for update in FROM clause
    • 另外,innerouter 是关键字
    【解决方案2】:

    首先,如果您有一个日期字段,您最好按日期识别最新记录。

    这将起作用:

    SELECT topic_id, object_id, title, url, date 
    FROM   topics earlier
    WHERE  EXISTS 
        (SELECT newest.topic_id 
         FROM   topics newest 
         WHERE  newest.date      > earlier.date 
         AND    newest.object_id = earlier.object_id)
    

    您正在选择存在具有相同 object_id 和更新日期的另一行的行。

    【讨论】:

      【解决方案3】:

      MySQL 中,您不能将目标表指定给子查询中的DML 操作(除非您将其嵌套超过一层,但在这种情况下您将无法获得可靠的结果并且不能使用相关子查询)。

      使用JOIN

      DELETE  td
      FROM    topics td
      JOIN    topics ti
      ON      ti.object_id = td.object_id
              AND ti.title = td.title
              AND ti.topic_id > td.topic_id;
      

      topics (object_id, title, topic_id) 上创建一个索引以使其快速工作。

      【讨论】:

      • 谢谢,看来它可以完成这项工作。
      【解决方案4】:

      使用 tbl AS (SELECT topic_id, object_id, row_number() over(partition by object_id order by topic_id DESC) as rnum
      来自主题) DELETE tbl WHERE rnum > 1

      欲了解更多信息,请查看这篇文章: http://blog.sqlauthority.com/2009/06/23/sql-server-2005-2008-delete-duplicate-rows/

      【讨论】: