如何在MySQL中基于列值删除重复行?
我的桌子是空的如何在MySQL中基于列值删除重复行?,mysql,database,sql-delete,Mysql,Database,Sql Delete,我的桌子是空的 id user_id date created_at 1 123 2020-02-02 2020-02-02 10:00:00 2 123 2020-02-02 2020-02-02 10:00:01 3 789 2020-02-12 2020-02-12 12:00:00 4 456 2020-02-10 2020-02-10 10:00:00 5 456 2020
id user_id date created_at
1 123 2020-02-02 2020-02-02 10:00:00
2 123 2020-02-02 2020-02-02 10:00:01
3 789 2020-02-12 2020-02-12 12:00:00
4 456 2020-02-10 2020-02-10 10:00:00
5 456 2020-02-10 2020-02-10 10:00:01
我想删除重复的条目,并希望得到所需的输出-
id user_id date created_at
1 123 2020-02-02 2020-02-02 10:00:00
3 789 2020-02-12 2020-02-12 12:00:00
4 456 2020-02-10 2020-02-10 10:00:00
我尝试了以下查询-
DELETE
`a`
FROM
`table1` AS `a`,
`table1` AS `b`
WHERE
`a`.`id` < `b`.`id` AND `a`.`user_id` <=> `b`.`user_id`
我的表格有9500000个条目
什么是更好的替代查询?尝试使用相关子查询:
DELETE t1
FROM table1 t1
WHERE EXISTS ( SELECT NULL
FROM table1 t2
WHERE t1.user_id = t2.user_id
AND t1.id > t2.id )
索引
(user\u id,id)
将提高查询速度。您有很多记录,因此它会给出超时错误。在较小的块中执行此操作。尝试下面的查询
DELETE
`a`
FROM
`table1` AS `a` inner join
`table1` AS `b`
WHERE
`a`.`id` < `b`.`id` AND `a`.`user_id` == `b`.`user_id` and `a`.`id` >***10000(Increase this)***
删除
`a`
从…起
`表1`AS`a`内部联接
`表1`AS`b`
哪里
`a`.`id`<`b`.`id`和`a`.`user\u id`=`b`.`user\u id`和`a`.`id`>***10000(增加该值)***
希望这将对您有所帮助。什么标准允许您决定哪些行必须存储,哪些行必须删除,哪些行构成具有相同
用户id的许多行?最小id?是的,最小id。@rik_maz你可以查看我的答案。创建新表通常更快,只保留你想要保留的行,然后用新表替换旧表。可能是
DELETE
`a`
FROM
`table1` AS `a` inner join
`table1` AS `b`
WHERE
`a`.`id` < `b`.`id` AND `a`.`user_id` == `b`.`user_id` and `a`.`id` >***10000(Increase this)***