我的数据库中有一个表来存储用户数据。我发现在将数据添加到此表数据库的代码中存在缺陷,如果发生网络超时,代码会使用前一个用户的数据更新下一个用户的数据。我已经解决了这个缺陷,但我需要清理数据库。我添加了一个标志来指示需要忽略的行,我的目标是相应地标记这些标志以防止重复。但在某些情况下,重复值实际上可能是合法的,因此我更感兴趣的是找到多个具有相同数据(即 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 命令来首先识别问题数据,然后我将能够标记条目。有人可以指导我正确的方向吗?
最佳答案
那么,首先选择具有最小用户 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;
关于mysql - 从 mySQL 数据库表中删除重复的用户条目,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9315228/