Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/database/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何在MySQL中基于列值删除重复行?_Mysql_Database_Sql Delete - Fatal编程技术网

如何在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)***