【问题标题】:Removing duplicate user entries from mySQL database table从 mySQL 数据库表中删除重复的用户条目
【发布时间】:2012-02-17 02:53:59
【问题描述】:

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

这是一个示例(表名 = 数据):

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 命令来首先识别问题数据,然后我将能够标记条目。有人可以指导我正确的方向吗?

【问题讨论】:

    标签: mysql duplicates


    【解决方案1】:

    好吧,首先选择具有最小用户 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;
    

    【讨论】:

    • 感谢您的回复。这看起来是正确的方法。我可以看到一些重复,但在用户之间看不到 - 我在同一用户之间看到重复数据,这对我来说没问题;我更关心在同一时间范围内(几分钟到 45 分钟内)拥有相同数据的不同用户。这很容易做到吗?
    • 谢谢!这非常有帮助!
    【解决方案2】:
    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);
    

    【讨论】:

      猜你喜欢
      • 2011-02-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-11-20
      • 2012-10-17
      • 2012-04-10
      • 2019-08-12
      相关资源
      最近更新 更多