mysql - 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
有没有更快的方法来做到这一点?
编辑:我应该说“计时器”不是唯一的列。
解决方案
我过去做过这个,解决这个问题的最简单方法是添加一个 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);
确保在删除任何内容之前备份所有内容以防万一。
推荐阅读
- javascript - Jmeter用双引号发送Cookie
- vba - workbooks.open 拉错文件
- python-3.x - Python生成带有条件的元组组合
- c# - 在文本框中的光标上显示工具提示
- php - 尝试将文本字段中的数据插入数据库时出现 MySQL 错误
- html - 使用自定义 html 标签在页面上显示图像
- c# - C# 中的类关联(多对多关系)
- php - Codeigniter base_url() 将 index.php 添加到我的路径中
- mysql - mysql选择唯一项目的最大值
- android - Gradle:发布ApkProductionRelease到内部测试