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