Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/66.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_Sql_Duplicates_Sql Delete - Fatal编程技术网

Mysql 从关系数据库表中删除重复记录

Mysql 从关系数据库表中删除重复记录,mysql,sql,duplicates,sql-delete,Mysql,Sql,Duplicates,Sql Delete,我有一个包含三列的数据库表。Id、用户Id、图书Id。此表中有一些重复项。一个用户id应该只有一个图书id的记录,但在某些情况下,一个用户id有几个图书id。已经有几百万条记录了,我想知道如何删除任何重复的记录。如果执行下面的语句,它将删除user\u ID的所有重复记录,并且只为每个user\u ID留下最大的ID DELETE a FROM tableName a LEFT JOIN ( SELECT user_ID, MAX

我有一个包含三列的数据库表。Id、用户Id、图书Id。此表中有一些重复项。一个用户id应该只有一个图书id的记录,但在某些情况下,一个用户id有几个图书id。已经有几百万条记录了,我想知道如何删除任何重复的记录。

如果执行下面的语句,它将删除
user\u ID
的所有重复记录,并且只为每个
user\u ID
留下最大的
ID

DELETE  a
FROM    tableName a
        LEFT JOIN
        (
            SELECT  user_ID, MAX(ID) max_ID
            FROM    tableName
            GROUP   BY user_ID
        ) b ON a.user_ID = b.user_ID AND
                a.ID = b.max_ID
WHERE   b.max_ID IS NULL
尝试以下内容

SQL SERVER

WITH ORDERED AS
(
    SELECT id
    ROW_NUMBER() OVER (PARTITION BY [user_id] , [book_id] ORDER BY id ASC) AS rn
    FROM
    tableName
)
delete from tableName
where id in ( select id from ORDERED where rn != 1)
MYSQL

根据注释编辑-在MySQL中,您不能修改在选择部分中使用的同一个表

这将解决问题

delete from tableName
where id not in( 
    select temp.temp_id from (
        select MIN(id) as temp_id from tableName    
        group by user_id, book_id
    ) as temp
)

这将只保留(用户id、图书id)的一个组合。

希望此查询将允许您删除重复项:

DELETE bl1 FROM book_log bl1
JOIN book_log bl2
ON (
    bl1.id > bl2.id AND
    bl1.user_id = bl2.user_id AND
    bl1.book_id = bl2.book_id
);

那么,删除记录的依据是什么?只要它为每个用户id留下一条记录就可以随机进行?您可以轻松地将其移动到子查询。那么
ROW\u NUMBER()
呢?我的问题是,在sql server中工作了很长时间,刚刚错过的问题是mysql。这正是我想要的,但我得到了这个错误:您的sql语法有错误;检查与您的MySQL服务器版本对应的手册,以了解使用near'ORDERED AS(选择id ROW\u NUMBER()OVER(PARTITION BY[user\u id]在第行)的正确语法1@William,是的,我发布的查询是针对Sql Server而不是MySql的。编辑了我的答案,现在检查。
JOIN
的性能远远好于
子句中的
DELETE bl1 FROM book_log bl1
JOIN book_log bl2
ON (
    bl1.id > bl2.id AND
    bl1.user_id = bl2.user_id AND
    bl1.book_id = bl2.book_id
);