2010-09-16 155 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