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

标签 mysql sql sql-delete

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

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

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

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

我试过下面这段代码但得到了错误:这个版本的 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
  );

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

最佳答案

尝试删除连接:

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;

关于MySQL - 有效删除除最后 N 条记录外的所有记录,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41477066/

相关文章:

Oracle 12c - 删除表和所有关联的分区

sql - 从优化中删除

mysql - 如何从表及其子表中获取结果集?

mysql - 将 Doctrine 2 与现有的 MySQL 数据库一起使用

python - 客户端机器上的 MySQLdb 可以连接到服务器机器上的数据库吗?

php - 通过在 php 中调整远程 PNG 图像的大小,哪种方法可以更快地提高页面速度?

sql - 返回基于 a 的条目包含带有 sql 的谓词

java - 在 JDBC 中使用特殊 SQL 关键字更新命令

php - MySQL 查询返回 double

php - 使用 cron 作业删除数据库