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

Guy*_*ush 5 mysql sql sql-delete

我最近开始学习 SQL,现在被要求对表执行一个简单的删除,保留每个用户的最后 100 条记录。我正在研究将其存档的最佳方法(更有效的方法),并找到了一些可能的解决方案(SQL 查询:从表中删除除最新 N 之外的所有记录?从 SQL 中的数据库表中删除除前 n之外的所有记录),但它是那种错综复杂的让我根据效率选择一个。所以我在这里寻求你的帮助。

这是我们保存用户访问日志的名为“访问”的表。

access:
- id (autoincrement) - primary
- userid (integer 11) - key
- refer (varchar 100)
- date (date/time)
Run Code Online (Sandbox Code Playgroud)

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

我已经尝试了以下代码,但出现错误:此版本的 MySQL 尚不支持“LIMIT & IN/ALL/ANY/SOME 子查询”

DELETE FROM
  access
WHERE
  id NOT IN (
    SELECT id FROM access WHERE userid = 10 ORDER BY id DESC LIMIT 100
  );
Run Code Online (Sandbox Code Playgroud)

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

Gur*_*ngh 1

尝试删除连接:

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;
Run Code Online (Sandbox Code Playgroud)

如果您想保留给定用户(例如 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;
Run Code Online (Sandbox Code Playgroud)

如果您只想删除用户 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;
Run Code Online (Sandbox Code Playgroud)


归档时间:

查看次数:

2548 次

最近记录:

5 年,2 月 前