使用相同的值删除索引高于X的行

时间:2013-11-15 22:18:37

标签: mysql sql sql-delete

我的每个帐户都有一个页面,显示最近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的经验......有人可以构建这个查询吗?

2 个答案:

答案 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

但是,这将使您的列表按降序显示。您可以通过几种不同的方式翻转订单。