我有一个名为“令牌”的表,该表存储了登录到管理面板的用户的所有登录令牌。
id users_id token created_time type access_time
220 3 $.... 2020-02-20 17:47:19 BACKOFFICE 2020-02-20 17:23:13
221 3 $.... 2020-02-20 17:47:19 BACKOFFICE 2020-02-21 13:12:16
222 3 $.... 2020-02-20 17:47:19 BACKOFFICE 2020-02-21 14:35:11
223 3 $.... 2020-02-20 17:47:19 BACKOFFICE 2020-02-22 15:37:11
224 3 $.... 2020-02-20 17:47:19 BACKOFFICE 2020-02-22 12:11:56
225 3 $.... 2020-02-20 17:47:19 BACKOFFICE 2020-02-23 13:59:19
我存储用户的users_id,创建令牌的时间以及访问和使用令牌的时间(以及其他一些位)
我的问题是,除了最近访问过的3个用户之外,我将如何删除该用户的所有密码?
答案 0 :(得分:1)
您可以使用row_number()
和join
:
delete t
from tokens t join
(select tt.*, row_number() over (partition by user_id order by access_time desc) as seqnum
from tokens tt
) tt
on tt.id = t.id
where tt.seqnum > 3;
答案 1 :(得分:0)
使用子查询获取最新的3个ID,然后在删除时将其排除。
DELETE tokens FROM tokens
LEFT JOIN (
SELECT id
FROM tokens
WHERE users_id = 3
ORDER BY access_time DESC
LIMIT 3) AS newest
ON tokens.id = newest.id
WHERE tokens.users_id = 3 AND newest.id IS NULL