MySQL - 高效删除除最后N条以外的所有记录

MySQL - Efficiently delete all records except last N

我最近开始学习 SQL,现在被要求对 table 执行简单的删除,为每个用户保留最后 100 条记录。我正在研究最好的方法(更有效的方法)来归档这个,并找到了一些可能的解决方案(SQL query: Delete all records from the table except latest N? , Delete all but top n from database table in SQL),但根据效率选择一个对我来说有点复杂。所以我在这里请求你的帮助。

这是我们保存用户访问日志的 table 称为 "access" 的地方。

access:
- id (autoincrement) - primary
- userid (integer 11) - key
- refer (varchar 100)
- date (date/time)

我的想法是在每次同一用户进入系统时从用户标识中删除旧记录,就在插入新日志之前。

我试过下面这段代码但出现错误:此版本的 MySQL 尚不支持 'LIMIT & IN/ALL/ANY/SOME subquery'

DELETE FROM
  access
WHERE
  id NOT IN (
    SELECT id FROM access WHERE userid = 10 ORDER BY id DESC LIMIT 100
  );

拜托,你能给我一些解决方案吗?谢谢!

我不是 Mysql 方面的专家,不知道为什么 Mysql 不允许这样做。尝试这样的事情

DELETE a
FROM   access a
       INNER JOIN (SELECT id
                   FROM   access
                   WHERE  userid = 10
                   ORDER  BY id DESC 
                   LIMIT 100) b
               ON a.id <> b.id 

注意:这可能不像评论中提到的那样有效

尝试删除连接:

delete a from access a left join (
    select id
    from access
    order by id desc limit 1000
) b on a.id = b.id
where b.id is null;

如果您想保留给定用户(例如 123)的前 1000 条记录不被删除:

delete a from access a left join (
    select id
    from access
    where userid = 123
    order by id desc limit 1000
) b on a.id = b.id
where b.id is null;

如果您只想删除用户 123 的行,但该用户的前 1000 行除外:

delete a from access a left join (
    select id
    from access
    where userid = 123
    order by id desc limit 1000
) b on a.id = b.id
where b.id is null
and a.userid = 123;