MySQL:如何删除特定用户ID的所有旧记录,但保留最新的3个?

时间:2020-02-20 18:20:16

标签: php sql

我有一个名为“令牌”的表,该表存储了登录到管理面板的用户的所有登录令牌。

    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个用户之外,我将如何删除该用户的所有密码?

2 个答案:

答案 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

DEMO