mysql限制登录日志表中每个用户的行数

时间:2011-05-23 02:27:59

标签: mysql sql greatest-n-per-group sql-delete

我有一个mysql表,每个用户登录我们的网站1行。我只想为每个用户保留最后10次登录。有些用户每天都会登录;其他人每月只有一次。所以我不能删除超过一定时间的行。

如何删除特定用户的第11行及更高行(按login_date排序时)?我有user_idlogin_date的列。对于每个user_id我只想保留最近的10行;其余的应该删除(这将通过每晚运行的cron作业发生;如果白天每个用户有超过10个登录记录,那就没关系;只是试图防止数据随着时间的推移而变得太大。)

3 个答案:

答案 0 :(得分:2)

为什么不挂钩创建新登录行的进程,如果有10个或更多,也删除最后一个?

删除它们,因为你是一个更好的选择,而不是批量删除它们随着它们的增长...随着你的应用程序的增长,开销会失控,并且通常导致头部划痕。

答案 1 :(得分:1)

您可以通过每晚运行此操作来实施保留政策:

    DELETE logins.*
      FROM logins
           -- Find those records with 10+ more recent records
INNER JOIN (   SELECT l.user_id, l.login_date
                 FROM logins l
            LEFT JOIN logins t
                   ON l.user_id = t.user_id AND l.login_date <= t.login_date
             GROUP BY 1, 2
               HAVING COUNT(1) > 10) too_old
        ON logins.user_id = too_old.user_id AND logins.login_date = too_old.login_date;

答案 2 :(得分:0)

这样就够了吗?

SELECT * FROM log WHERE login_date > DATE_SUB(curdate(), INTERVAL 1 DAY)