1

我有一个名为“user-recent-activity”的表,其中包含以下列:id、userid、activity 和 datetime。现在,如果任何唯一用户标识的项目超过 50 个,我想删除记录,删除最旧的记录。例如,如果用户 id(比如说 1234)在这个表中有超过 50 条记录,那么我必须保存用户 id(1234)的最新 50 条记录并删除最旧的一条。

4

3 回答 3

3

在插入之前,查询具有该 ID 的最后 50 条记录(从新到旧排序)。如果有50 个,则替换它(通过更新)而不是插入新行。

于 2012-07-20T00:52:58.510 回答
1

假设您使用的是支持标准 SQL 的 RDBMS,则应该使用以下存储过程。

创建过程 remove-old-activities (@userid int) 作为从 user-recent-activity 中删除,其中 userid=@userid 和 id 不在(从 user-recent-activity 中选择前 50 个 id,其中 userid=@userid order by datetime desc)

如果您的数据库不支持存储过程,那么您应该能够使用 SQL 参数来传递用户 ID 值...

希望有帮助

于 2012-07-20T00:55:18.297 回答
0

您可以使用 rank 方法精确定义行数,从而删除您想要的行。

 delete from tblName where id=
        (select id from (       
            select @i := CASE WHEN ( @userid <> userid ) THEN 1                      
                ELSE  @i+1                                      
                END AS rank , id,userid, datetime2 ,@userid:=userid AS clset          
            from tblName x,(SELECT @i:=0) a ,(SELECT @userid:= 0) s 
            order by x.userid, datetime2 desc) T 
          where T.rank='50')    ;

另一种选择:使用选择查询选择排名 <=50 并插入到新表中。删除旧表,然后重命名新表。

insert into newtable (userid,activity,datetime2)
select userid,datetime2 from (
      select @i := CASE WHEN ( @userid <> userid ) THEN 1 
                    ELSE 
                     @i+1                     
                END AS rank , userid, activity,datetime2 ,@userid:=userid AS clset 
       from tblName x,(SELECT @i:=0) a ,(SELECT @userid:= 0) s
       order by x.userid, datetime2 desc) T
where t.rank <=50
于 2012-07-20T01:20:09.333 回答