从mySQL数据库表中删除重复的用户条目
我在我的数据库中有一个表来存储用户数据。我在代码中发现了一个缺陷,即将数据添加到此表数据库,如果发生网络超时,代码会使用先前用户的数据更新下一个用户的数据。我已经解决了这个缺陷,但我需要清理数据库。我添加了一个标志来指示需要忽略的行,并且我的目标是将这些标志相应地标记为重复项。在某些情况下,重复值可能实际上是合法的,所以我更有兴趣找到具有相同数据的多个用户(即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命令来识别问题数据,然后我就可以标记条目。有人能指引我朝着正确的方向吗?
好了,先用自己分钟的用户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;
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);
感谢您的回复。这看起来是正确的方法。我能够看到一些重复但不在用户之间 - 我在同一用户中看到重复的数据,这对我来说没问题;我更关心不同的用户在同一时间段内拥有相同的数据(在几分钟到45分钟内)。这可以轻松完成吗? – user836200 2012-02-16 17:36:31
嗨,我更新了我的答案,希望它可以帮助你。 – biziclop 2012-02-16 18:55:14
谢谢!这非常有帮助! – user836200 2012-02-17 02:41:10