从mySQL数据库表中删除重复的用户条目

时间:2012-02-16 16:39:35

标签: mysql duplicates

我的数据库中有一个表来存储用户数据。我在代码中发现了一个缺陷,它将数据添加到此表数据库中,如果发生网络超时,代码会使用先前用户的数据更新下一个用户的数据。我已经解决了这个缺陷,但我需要清理数据库。我添加了一个标志来指示需要忽略的行,我的目标是相应地标记这些标志以备重复。但是,在某些情况下,重复值实际上可能是合法的,因此我更感兴趣的是找到具有相同数据的多个用户(即,u> 2)。

这是一个例子(tablename = Data):

  

id ---- user_id ---- data1 ---- data2 ---- data3 ---- datetime ----------- flag

     

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 id标记标记为1(表示忽略)。因为我们知道usr1是原始数据点(假设最早的日期在列表中较早)。

此时表中有太多条目,我不确定识别具有重复条目的用户的最佳方式。

我正在寻找一个mysql命令来首先识别问题数据然后我将能够标记这些条目。有人能引导我朝正确的方向发展吗?

2 个答案:

答案 0 :(得分: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;

答案 1 :(得分: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);
相关问题