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