我最近开始学习 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/