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