我已经好好看了一下,但是能够找到一个解决方案,所以希望有人可以帮助解决这个问题。
我有一个来自内部日志记录应用程序的MySQL结果表,它记录了一个检查例程的结果,有许多检查例程用跟踪器列标识:
id (int)(PK), tracker (int), time (timestamp), result (int)
如果之前的结果不相同,则只需要记录结果,只需要捕获更改。不幸的是,当它在一个月前建成(匆忙)时被忽略了,结果被盲目记录而没有检查以前的结果。现在已经记录了这一点,但我仍然留下了几千行,其中有相当多的是重复的条目,而我正在采取一种清除这些的方式来留下变化点。
所以我需要遍历每一行,查看该跟踪器记录的上一个结果并删除该行,如果它相同,这有点超出了我对MySQL的经验和我迄今为止所做的尝试相当差!
有人可以帮忙吗?
答案 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...
作为复制现有(跟踪器,时间,结果)键的插入将导致错误。