簡體   English   中英

在MySQL中按限制和條件刪除記錄

[英]Delete records by limit and condition in MySQL

我在MySQL數據庫之一中有一個名為log的表。 它用於記錄用戶操作。 當它變得很大時,我想刪除一些記錄。

SELECT `userid`, `timestamp` 
FROM `log`
ORDER `timestamp` ASC

輸出是

userid    timestamp
     2    120000
     3    123333
     1    123456
     1    124444
     2    125555
     2    126666
     1    127777
     1    128888
     2    129999
     3    130000
     1    131111

我想做的是-我只想為每個用戶保留最后3條記錄 因此,我需要為每個用戶刪除第4、5,...,n個記錄。 根據以上示例,期望輸出為

userid    timestamp
     3    123333
     2    125555
     2    126666
     1    127777
     1    128888
     2    129999
     3    130000
     1    131111

我知道可以使用LIMIT刪除記錄。

 DELETE FROM `log` LIMIT 3

僅刪除3條記錄。 它根本無法得到我想要的結果。

我試過的是

DELETE FROM
`log`
WHERE `userid` IN (
SELECT `userid` FROM (SELECT `userid`, COUNT(1) AS C
FROM `log`
GROUP BY `userid`
HAVING C > 3) CountTable ) LIMIT 3

這不是我想要的。

嘗試這個:

DELETE l FROM `log` l 
LEFT JOIN (SELECT l.userid, l.timestamp
           FROM (SELECT l.userid, l.timestamp, 
                        IF(@lastUserId = @lastUserId:=userid, @Idx:=@Idx+1, @Idx:=0) rowNumber 
                 FROM `log` l, (SELECT @lastUserId:=0, @Idx:=0) A
                 ORDER BY l.userid, l.timestamp DESC
                ) AS A
           WHERE rowNumber < 3
          ) AS A ON l.userid = A.userid AND l.timestamp = A.timestamp 
WHERE A.userid IS NULL

編輯:

DELETE l FROM `log` l 
WHERE NOT EXISTS (
          SELECT 1
          FROM (SELECT l.userid, l.timestamp, 
                       IF(@lastUserId = @lastUserId:=userid, @Idx:=@Idx+1, @Idx:=0) rowNumber 
                FROM `log` l, (SELECT @lastUserId:=0, @Idx:=0) A
                ORDER BY l.userid, l.timestamp DESC
               ) AS A
          WHERE l.userid = A.userid AND l.timestamp = A.timestamp AND rowNumber < 3
         )

檢查SQL FIDDLE DEMO

OUTPUT

| USERID | TIMESTAMP |
|--------|-----------|
|      3 |    123333 |
|      2 |    125555 |
|      2 |    126666 |
|      1 |    127777 |
|      1 |    128888 |
|      2 |    129999 |
|      3 |    130000 |
|      1 |    131111 |

請嘗試以下SQL:

DELETE FROM log WHERE find_in_set(
    TIMESTAMP, (
        SELECT group_concat(t3) t4 FROM (
            SELECT 1 AS dummy,
            replace(group_concat(TIMESTAMP ORDER BY TIMESTAMP DESC), concat(SUBSTRING_INDEX(group_concat(TIMESTAMP ORDER BY TIMESTAMP DESC), ',', 3), ','), '') t3
            FROM log
            GROUP BY user_id HAVING count(*) > 3
        ) a GROUP BY dummy
    )
)

SQL小提琴

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM