2012-02-16 133 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); 
相关问题