2011-05-23 30 views
1

我有一個mysql表,每個用戶都有1行登錄到我們的網站。我只想保留每個用戶的最近10次左右登錄。一些用戶每天登錄;其他人每月只有一次。所以我不能只刪除超過一定時間的行。mysql限制每個用戶在登錄日誌表中的行

如何刪除特定用戶的第11行和更高行(當按login_date排序時)?我有user_idlogin_date的列。對於每個user_id我只想保留最近的10行;其餘的應該被刪除(這將通過每天晚上的cron作業運行;如果在白天每個用戶有超過10個登錄記錄,只是試圖防止數據隨着時間變得太大)。

回答

0

這樣就夠了嗎?

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

爲什麼不掛鉤創建新登錄行的進程也刪除最後一個,如果有10個或更多?

刪除它們,因爲你是一個更好的選擇,比批量刪除它們,因爲它們會增長..隨着你的應用程序的增長,開銷將失去控制,並且通常會導致頭疼。

+0

或者更好,使用[INSERT觸發器(http://dev.mysql.com/doc/refman/5.6/en/create -trigger.html)刪除額外的行。 – 2011-05-23 02:53:10

+0

如果該用戶的行數超過10行,我喜歡插入後刪除的想法。 mysql中有一種簡單的方法可以從第10行結果中獲取值嗎?我想要做的事情如下:DELETE * FROM user_logins WHERE user_id = xxx AND login_date <[第10行WHERE user_id = xxx ORDER BY login_date DESC]的值 – 2011-05-23 02:56:45

+0

@mu太短:觸發器在mysql中很瘋狂,所以我害羞地建議他們,除非我知道他們正在使用工作實施的數據庫。 – richo 2011-05-23 03:09:32

0

您可以通過夜間運行這個工具你的保留策略:

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;