2010-09-16 98 views
0

我有一个很好的环顾四周,但havnt能够找到一个解决方案,所以希望有人可以帮助这个。删除重复的条目从条件的数据库

我有一个内部的记录应用程序从一个例行检查记录结果结果的MySQL表,还有一些检查程序的其中与追踪列标识:

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

一个唯一的结果如果前面的结果不一样,需要记录,只需要捕获变化。不幸的是,它在一个月前被建立(匆忙)时被忽略,并且结果被盲目记录,没有检查以前的结果。现在已经记录下来了,但我仍然留下了几千行,其中有很多是重复的条目,而我正在清除这些内容以便留下更改点。

因此,我需要浏览每一行,查看该跟踪器记录的以前的结果,并删除该行(如果它相同),这有点超出了我对MySQL的使用经验,并且迄今为止所做的尝试都有相当差!

任何人都可以帮忙吗?

回答

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) 
+0

排名第一的是我之后做的,减少了大约90%的行数,这肯定会使查询和备份更快。非常感谢! – Duncan 2010-09-16 04:00:19

+1

为什么你需要第二个建议查询中的包装子查询? – MattSmith 2010-09-16 05:50:16

+1

@MattSmith:如果没有包装,你会得到MySQL#1093有关引用变异表的错误。 – 2010-09-16 15:29:30

0

有人抱怨说这个执行速度很慢,但这可能不会影响到你。它必将是比什么都更快,你可以这样做:

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

我需要记录结果的任何和所有变化,所以这不会工作不幸。 – Duncan 2010-09-16 04:02:05

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...,因为插入会复制现有(跟踪器,时间,结果)键会导致错误。

+0

它没有明确说明,但OP的确如此打算阅读......但您无法应用约束,直到数据满足为止。 OP表示他们想要删除重复的... – 2010-09-16 03:22:10

+0

我对这些行有想法以便将来录制,但是几分钟后捕获的结果仍会产生新行,即使结果与时间不同也是如此一定? – Duncan 2010-09-16 04:05:41