【问题标题】:Mysql delete older duplicatesMysql删除旧的重复项
【发布时间】:2013-07-12 18:36:32
【问题描述】:

我有这个数据的表格

id、归档 id、ean、索引、日期、(...)

我有一些具有相同存档 ID、相同 ean 但索引不同的项目。

所以在这种情况下,我想删除较旧的(基于日期)项目,因此结果将是每个组合 archive_id/index 不会超过 1 个结果。

【问题讨论】:

    标签: mysql database


    【解决方案1】:

    以下(未经测试)应该可以工作:

    DELETE FROM someTable WHERE EXISTS ( SELECT id FROM someTable AS subqTable WHERE
    subqTable.id = someTable.id
    AND subqTable.ean = someTable.ean
    -- and other equality comparisons
    AND subqTable.date AFTER someTable.date)
    

    【讨论】:

    • 有没有办法在对整个表运行之前对一些有限(如 10 个项目)的项目进行测试?
    • 是的,您可以在DELETE 语句中使用LIMITdev.mysql.com/doc/refman/5.5/en/delete.html
    • 顺便说一句,我不确定您使用什么 .id - 这在我的情况下完全无关紧要。需要吗?只需要保留(archive_id + index)的某种组合的结果中的“最新”之一
    • 不,不是,我只是不确定如果没有通配符*,MySQL 是否也能更好地优化此类选择。
    【解决方案2】:
    DELETE duplicates.*
    FROM _table
    JOIN _table AS duplicates
        ON (_table.archive_id = duplicates.archive_id AND _table.index = duplicates.index)
    WHERE duplicates.date < _table.date;
    

    【讨论】:

      【解决方案3】:
      delete t1
      from your_table t1
      left join 
      (
        select archive_id, ean, min(date) as mdate
        from your_table
        group by archive_id, ean
      ) t2 on t1.archive_id = t2.archive_id
           and t1.ean = t2.ean
           and t1.date = t2.mdate
      where t2.mdate is null
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2016-10-10
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-04-01
        相关资源
        最近更新 更多