2013-04-11 73 views
0

我已經看過另一個類似主題的問題,但它不能解決我目前遇到的問題。如何通過時間差異刪除MySQL數據庫中的重複內容

我有兩個表:

users (id, name) 

projects (id, user_id, image, inserted) 

如表中的Flash應用程序錯誤的結果「的項目」有很多重複的(一個項目加幾次)。在連續的副本之間有幾秒的時差(小於10秒),這是確定重複的唯一方法(用戶可以添加無限數量的項目,但創建一個至少需要一分鐘)。

如何選擇和刪除副本(並保留原來的副本)?

編輯:

解決方案由Robin Castlin張貼下面是幾乎沒有,但此查詢:

SELECT p2.id 
FROM project AS p 
INNER JOIN project AS p2 
ON p.id != p2.id AND p.user_id = p2.user_id AND 
    ABS(TIME_TO_SEC(TIMEDIFF(p.inserted, p2.inserted))) <= 10 
GROUP BY p2.id 

選擇所有副本(如果用戶添加項目的5倍它給了我5個IDS)。那麼讓我們來扭轉問題:如何從該組中選擇除第一個/最後一個以外的所有內容?還是隻有第一個/最後一個?

+0

通過上述查詢手動(僅約200行)選擇最後,我已經刪除副本。但無論如何,問題是有趣而有趣的 - 對於更大型的數據庫,顯然手動解決方案是不可能的。 – Marek 2013-04-11 11:02:22

回答

3
CREATE TEMPORARY TABLE tmp_project (
    p1_id INT, 
    p2_id INT 
) 
SELECT p.id, p2.id 
FROM project AS p 
INNER JOIN project AS p2 
ON p.user_id = p2.user_id AND 
    ABS(TO_SECONDS(TIME_DIFF(p.inserted, p2.inserted))) <= 10; 

SELECT p2_id 
FROM tmp_project 
WHERE p2_id NOT IN (SELECT p2_id 
        FROM tmp_project 
        GROUP BY p1_id) 
GROUP BY p2_id; 

我現在變得更加複雜一點。因爲我們需要使用相同的行兩次來過濾第一次出現的事情,所以我創建了一個臨時表並在其後處理它。我加入了所有的情況,即使是在同一個ID上,然後使用NOT INGROUP BY p1_id進行過濾。

此溶液也可用於如果圖像數據,其中對於相同的重複:

不應該image場是在這些情況下相同?

SELECT id 
FROM project 
WHERE id NOT IN ( SELECT id 
        FROM projects 
        GROUP BY image, user_id) 

這將使你得到一個不是表中第一個重複項的列表。


然後取這些ID和簡單地

DELETE FROM project WHERE id IN (id1, id2, id3, ...) 
+0

實際上,第一個查詢應該是'GROUP BY image,user_id' - 兩個(或多個)獨立用戶可能創建了具有相同圖像值的項目。 – 2013-04-11 08:25:02

+0

不幸的圖像名稱是獨一無二的(從時間戳創建) – Marek 2013-04-11 08:26:42

+0

創建時間戳在哪裏?在MySQL中?或者在Flash中? – 2013-04-11 08:28:11

0

讓兩個不同的時間差距。

如果差值爲10秒[根據您的帖子],那麼不要添加它。

這是一個問題,將幫助你在時間之間做出精確的區別。

How to Split Time and calculate time difference in sql server 2005?

+0

這部分回答了問題,但並未解決問題。 – 2013-04-11 08:23:13

+0

@PaulGregory是的,我知道它。準確答案將直接發佈查詢。但我只是發佈可以引導用戶進行查詢的信息。 – Freelancer 2013-04-11 08:25:11