从条件中删除数据库中的重复条目

时间:2010-09-16 02:42:02

标签: sql mysql

我已经好好看了一下,但是能够找到一个解决方案,所以希望有人可以帮助解决这个问题。

我有一个来自内部日志记录应用程序的MySQL结果表,它记录了一个检查例程的结果,有许多检查例程用跟踪器列标识:

id (int)(PK), tracker (int), time (timestamp), result (int)

如果之前的结果不相同,则只需要记录结果,只需要捕获更改。不幸的是,当它在一个月前建成(匆忙)时被忽略了,结果被盲目记录而没有检查以前的结果。现在已经记录了这一点,但我仍然留下了几千行,其中有相当多的是重复的条目,而我正在采取一种清除这些的方式来留下变化点。

所以我需要遍历每一行,查看该跟踪器记录的上一个结果并删除该行,如果它相同,这有点超出了我对MySQL的经验和我迄今为止所做的尝试相当差!

有人可以帮忙吗?

3 个答案:

答案 0 :(得分:2)

使用:

   DELETE a
     FROM YOUR_TABLE a
LEFT JOIN (SELECT MAX(t.id) AS latest_id
             FROM YOUR_TABLE t
         GROUP BY t.tracker, t.result) b ON b.latest_id = a.id
    WHERE b.latest_id IS NULL

使用IN:

替代
DELETE FROM YOUR_TABLE
 WHERE id NOT IN (SELECT x.latest_id
                   FROM (SELECT MAX(t.id) AS latest_id
                          FROM YOUR_TABLE t
                      GROUP BY t.tracker, t.result) x )

答案 1 :(得分:0)

有人抱怨说执行起来很慢,但这可能不会影响你。它肯定会比你做的任何其他事情都快:

select DISTINCT id, tracker, time, result
from table;

答案 2 :(得分:0)

我想你想要一张独特的索引:

ALTER IGNORE TABLE table ADD UNIQUE INDEX (tracker, time, result)

http://dev.mysql.com/doc/refman/5.1/en/alter-table.html

添加新行时,您必须使用INSERT IGNORE...作为复制现有(跟踪器,时间,结果)键的插入将导致错误。

相关问题