我的每个帐户都有一个页面,显示最近10次登录的IP和日期。每个帐户我只需要最后10个,所以我想删除具有相同account_id
值的第11,12,13行。我的表结构:
+----+------------+------------+------------+
| id | account_id | ipv4 | timestamp |
+----+------------+------------+------------+
| 25 | 9977930 | 1299288404 | 1362261821 |
| 26 | 9982862 | 1604359422 | 1362262365 |
+----+------------+------------+------------+
我尝试过类似的事情:
DELETE t1 FROM `lastlogin` t1
LEFT JOIN
(
SELECT `account_id`
FROM `lastlogin`
LIMIT 10 OFFSET 10
) t2 on t2.account_id = t1.account_id AND t2.value = t1.value
WHERE t2.value is null;
但我的选择陈述是错误的,其余的也是坏的。我没有好主意,除了为索引添加新列以外,如何做到这一点,以及更高级SQL的经验......有人可以构建这个查询吗?
答案 0 :(得分:2)
我会使用行号函数,所以:
Delete t1 from
(select accountid,
row_number() over (partition by accountid, order by accountid,
Timestamp desc) as r
From lastlogin ) t1
where t1.r > 10
希望这种语法是正确的,基本上你使用行号函数来创建一个数字,该数字按递减时间顺序为每个不同的ip递增,并为每个不同的帐户重置。
这假设您需要最新的ips并且每个ip都是不同的。如果ips不是按时间戳或Id分区。首先运行select!
答案 1 :(得分:0)
在首先填充的查询中执行此操作。
你有时间戳。
SELECT TOP 10
...
ORDER BY timestamp DESC
但是,这将使您的列表按降序显示。您可以通过几种不同的方式翻转订单。