首页 > 解决方案 > MYSQL 删除用户 ID 的重复项

问题描述

我以为我已经使userid表中的列"userslive"独一无二,但不知何故一定犯了一个错误。我已经看到了这个问题的多个答案,但我害怕再次搞砸所以我希望有人可以直接帮助我。

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

这是一个相当大的表,大约2 million行 ( 20 columns)。我使用此查询发现了关于1000重复的内容:userid

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

这是正确的语法吗?我在备用桌子上试过这个,但我怀疑这对于这么大的桌子来说太重了(除非让它运行很长时间。

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

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

编辑:我应该说“计时器”不是唯一的列。

标签: mysqlquery-performance

解决方案


我过去做过这个,解决这个问题的最简单方法是添加一个 id 列,然后选择 userid, max(new_id) 到一个新表中并将其加入删除。像这样的东西。

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

现在您有了新的唯一列并创建一个新表来选择要删除的列。

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);

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


推荐阅读