想要删除任何唯一的用户ID有超过50个项目

时间:2012-07-20 00:42:53

标签: php mysql

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

3 个答案:

答案 0 :(得分:3)

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

答案 1 :(得分:1)

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

创建过程删除旧活动 ( @userid int ) 如 从用户最近活动中删除userid = @ userid且id not in(从user-recent-activity中选择前50个id,其中userid = @ userid order by datetime desc)

如果您的DB不支持存储过程,那么您应该能够使用SQL参数传递userid值...

希望有所帮助

答案 2 :(得分: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')    ;

另一种选择: 使用选择查询选择等级&lt; = 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