Php 要删除任何具有50个以上项目的唯一用户标识吗

Php 要删除任何具有50个以上项目的唯一用户标识吗,php,mysql,Php,Mysql,我有一个名为user recent activity的表,它有以下列:id、userid、activity和datetime。现在,如果任何唯一的userid有超过50个条目,我想删除这些记录,删除最早的记录。例如,如果用户IDlet说1234在此表中有50多条记录,那么我必须保存用户id1234的最新50条记录并删除最旧的记录。在插入之前,按从新到旧的顺序查询该ID的最后50条记录。如果有第50条记录,则通过更新替换它,而不是插入新行。插入前,按从新到旧的顺序查询该ID的最后50条记录。如果有

我有一个名为user recent activity的表,它有以下列:id、userid、activity和datetime。现在,如果任何唯一的userid有超过50个条目,我想删除这些记录,删除最早的记录。例如,如果用户IDlet说1234在此表中有50多条记录,那么我必须保存用户id1234的最新50条记录并删除最旧的记录。

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

插入前,按从新到旧的顺序查询该ID的最后50条记录。如果有第50行,则通过更新替换它,而不是插入新行。

假设您使用的是支持标准SQL的RDBMS,则以下存储过程应执行此操作

创建过程删除旧活动 @用户ID int 像 从用户最近的活动中删除,其中userid=@userid和id不在“从用户最近的活动中选择前50个id”,其中userid=@userid按日期时间顺序描述

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


希望这对您有所帮助

假设您使用的是支持标准SQL的RDBMS,下面的存储过程应该可以做到这一点

创建过程删除旧活动 @用户ID int 像 从用户最近的活动中删除,其中userid=@userid和id不在“从用户最近的活动中选择前50个id”,其中userid=@userid按日期时间顺序描述

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


希望对您有所帮助

您可以使用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')    ;
另一种选择:
使用select查询选择秩您可以使用秩方法精确定义行数,从而删除所需的行

 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')    ;
另一种选择:

使用select查询选择列组—在写入用户最近的活动表的任何操作之后,只需调用此存储过程,或者最好仍由附加到同一表的insert触发器调用它。在您的情况下,我必须在过程调用中传递用户id。对于用户id,我必须调用另一个select查询。确实如此,但是该列表很容易生成,您可以在该列表上使用光标将每个列表传递给存储过程或直接执行:按userid从user recent activity GROUP BY userid have COUNTuserid>50从user recent activity GROUP中选择userid在任何写入用户最近的活动表或更好的活动表仍然由附加到同一表的插入触发器调用。在您的情况下,我必须在过程调用中传递用户id。对于用户id,我必须调用另一个select查询。事实上,您可以调用另一个select查询,但是该列表很容易生成,您可以在该列表上使用光标将每个列表传递到存储的进程或直接执行:按COUNTuserid>50+1的userid从用户最近的活动组中选择userid,如您的答案,但有什么方法可以从数据库中删除记录吗?既然可以重用,为什么还要删除呢?您可以用delete和insert替换替换操作,但为什么不用一次更新来同时执行这两个操作?+1,就像您的答案一样,但是有什么方法可以从数据库中删除记录?当您可以重用时,为什么要删除?您可以用删除和插入来替换替换操作,但为什么不用一次更新来替换这两个操作呢,表中有数千个用户ID,我想通过cron作业删除记录。这给了我一个错误:1242-子查询返回的行数超过1行。那么请使用第二个选项。我对第二个选项感到困惑,删除条目的过程不是很长:第二个选项用于一次性工作。也就是说,select所有带有rank userid的条目都不是硬编码的,表中有数千个userid,我想通过cron job删除记录。这给了我一个错误:1242-Subquery返回超过1行请使用第二个选项。我对第二个选项感到困惑,删除条目不是一个很长的过程:第二个选项是一次性工作。即选择所有具有排名的条目