MYSQL 删除重复的用户标识

MYSQL drop duplicates of userid

我以为我在我的 table "userslive" 中使列 userid 独一无二,但不知何故一定是犯了一个错误。这个问题我看过很多答案,但我怕又搞砸了所以我希望有人能直接帮助我。

所以这个 table 没有唯一的列,但我有一个列 "timer",它是抓取数据的时间戳。如果可能的话,我想删除具有最低 "timer" 和重复 "userid" 列的行。

这是一个相当大的 table,大约 2 million 行 (20 columns)。我使用此查询发现了大约 1000 个重复项 userid

SELECT userid, COUNT(userid) as cnt FROM userslive GROUP BY userid HAVING (cnt > 1);

这是正确的语法吗?我在备份 table 上试过这个,但我怀疑这对于这么大的 table 来说太重了(除非长时间留给 运行。

  DELETE FROM userslive using userslive,
      userslive e1
  where userslive.timer < e1.timer
      and userslive.userid = e1.userid  

有没有更快的方法来做到这一点?

编辑:我应该说 "timer" 不是唯一列。

我过去做过这个,解决这个问题最简单的方法是添加一个 id 列,然后 select userid, max(new_id) 到一个新的 table 并加入删除。像这样。

ALTER TABLE `userslive` 
    ADD `new_id` INT  UNSIGNED  NOT NULL  AUTO_INCREMENT  PRIMARY KEY;

现在您有了新的唯一列并创建一个新的 table 用于 select 要删除的列。

CREATE TABLE `users_to_delete` 
AS 
SELECT userid, new_id 
FROM (
    SELECT userid, max(new_id) new_id, count(*) user_rows
    FROM `userslive`
    GROUP BY 1
) dataset 
WHERE user_rows > 1

然后通过将其加入 DELETE 语句来使用它来删除重复的行,如下所示:

DELETE `userslive` FROM `userslive` 
    INNER JOIN `users_to_delete` USING(userid,new_id);

确保在删除任何内容之前备份所有内容以防万一。

DELETE t1.*     /* delete from a copy named t1 only */
FROM userslive t1, userslive t2
WHERE t1.userid = t2.userid  
  AND t1.timer < t2.timer

fiddle

逻辑:如果对于某些记录(在别名为 t1 的副本中)我们可以找到具有相同用户但具有 greater/later 计时器值的记录(在别名为 t2 的 table 副本中) - 这条记录必须删除。