2012-02-16 97 views
1

我在我的數據庫中有一個表來存儲用戶數據。我在代碼中發現了一個缺陷,即將數據添加到此表數據庫,如果發生網絡超時,代碼會使用先前用戶的數據更新下一個用戶的數據。我已經解決了這個缺陷,但我需要清理數據庫。我添加了一個標誌來指示需要忽略的行,並且我的目標是將這些標誌相應地標記爲重複項。在某些情況下,重複值可能實際上是合法的,所以我更有興趣找到具有相同數據的多個用戶(即u> 2)。從mySQL數據庫表中刪除重複的用戶條目

下面是一個例子(表名=數據):

ID ---- ---- USER_ID DATA1 ---- ---- DATA2 DATA3 ---- -----日期時間------國旗

1 ----- usr1 -------- 3 ---------- 2 --------- 2-- ------- 2012-02-16 ..----- 0

2 ----- usr2 -------- 3 ---------- 2 --------- 2 --------- 2012-02-16 ..----- 0

3 ----- usr3 ------ --3 ---------- 2 --------- 2 --------- 2012-02-16 ..----- 0

在這種情況下,我想將1和2標記標記爲1(表示忽略)。由於我們知道usr1是原始數據點(假設最早的日期在列表中較早)。

此時表中有太多條目,我不確定識別具有重複條目的用戶的最佳方式。

我正在尋找一個mysql命令來識別問題數據,然後我就可以標記條目。有人能指引我朝着正確的方向嗎?

回答

0

好了,先用自己分鐘的用戶ID選擇重複數據:

CREATE TEMPORARY TABLE duplicates 
    SELECT MIN(user_id), data1,data2,data3 
    FROM data 
    GROUP BY data1,data2,data3 
    HAVING COUNT(*) > 1      -- at least two rows 
    AND COUNT(*) = COUNT(DISTINCT user_id) -- all user_ids must be different 
    AND TIMESTAMPDIFF(MINUTE, MIN(`datetime`), MAX(`datetime`)) <= 45; 

(我不知道,如果我用TIMESTAMPDIFF正常。) 現在我們可以在這些行更新的標誌,在user_id是不同:

UPDATE  duplicate 
INNER JOIN data  ON data.data1 = duplicate.data1 
        AND data.data2 = duplicate.data2 
        AND data.data3 = duplicate.data3 
        AND data.user_id != duplicate.user_id 
SET data.flag = 1; 
+0

感謝您的回覆。這看起來是正確的方法。我能夠看到一些重複但不在用戶之間 - 我在同一用戶中看到重複的數據,這對我來說沒問題;我更關心不同的用戶在同一時間段內擁有相同的數據(在幾分鐘到45分鐘內)。這可以輕鬆完成嗎? – user836200 2012-02-16 17:36:31

+0

嗨,我更新了我的答案,希望它可以幫助你。 – biziclop 2012-02-16 18:55:14

+0

謝謝!這非常有幫助! – user836200 2012-02-17 02:41:10

0
UPDATE Data A 
LEFT JOIN 
(
    SELECT user_id,data1,data2,data3,min(id) min_id 
    FROM Data GROUP BY user_id,data1,data2,data3 
) B 
ON A.id = B.min_id 
SET A.flag = IF(ISNULL(B.min_id),1,0); 

如果有涉及到重複的時候,也許嘗試這個

UPDATE Data A 
LEFT JOIN 
(
    SELECT user_id,data1,data2,data3,,`datetime`,min(id) min_id 
    FROM Data GROUP BY user_id,data1,data2,data3,`datetime` 
) B 
ON A.id = B.min_id 
SET A.flag = IF(ISNULL(B.min_id),1,0);