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