取对应所有人日志记录的最新前10条记录

今天突然收到老大的一个任务,要我做一个定时任务,去删除日志记录,要求每个人的对应的日志记录保留最新的10条,其他的全部删除。

数据库:MySql

用到知识包括数据库的临时变量:

开始给变量赋值,给变量asea赋值变量 ‘威武霸气’

 

 

 

 当下一次查询的时候直接可以查变量asea时就可以直接显示出来:

 

 

 下面进入正题,如图有个用户操作表,已经根据用户和操作时间进行排序:

 

 

 如何每个user_id筛选出操作记录的出前10个呢?

先给出sql:

select id,operate_type,operate_at,if(@tmp=user_id,@rank:=@rank+1,@rank:=1) as 排名, @tmp:=user_id as userId  from `wei_user_operate_log` ORDER BY user_id asc, operate_at desc;

 

 

 接下来只需对排名进行筛选即可,

SQL讲解:

select id,operate_type,operate_at,if(@tmp=user_id,@rank:=@rank+1,@rank:=1) as 排名, @tmp:=user_id as userId  from `wei_user_operate_log` ORDER BY user_id asc, operate_at desc;

定义两个临时变量 tmp,rank。

当游标在第一行时,判断条件:if(@tmp=user_id,@rank:=@rank+1,@rank:=1) as 排名

中的@tmp并没有赋值,所以判断条件为false, 执行@rank:=1,临时变量的值为rank=1,接下来按顺序执行@tmp:=user_id as userId,将第一行记录的user_id赋值给tmp

当游标在第二行是,由于,tmp的值是上一个游标的user_id,所以if(@tmp=user_id,@rank:=@rank+1,@rank:=1) as 排名 的判断条件为true 执行@rank:=@rank+1 ,由于rank在第一行赋值为1了,则第二行+1,rank的值为2,然后执行将第二行记录的user_id赋值给tmp

依此类推....

当游标移动到某个user_id不等于@tmp时,如ID=54时,user_id=4132135456414是,而判断条件if(@tmp=user_id,@rank:=@rank+1,@rank:=1) as 排名,中的@tmp还是上一个游标中的user_id=4132135456413,则判断条件为false,@rank=1重新开始计数,

所以改行的排名是1,而不是14.

总结:将上一行的user_id和本行的user_id做对比,如果本行的user_id和上一行的相同就排名+1,不相同就初始化排名:rank=1

 

posted @ 2020-06-19 11:29  neptunus  阅读(36)  评论(0)    收藏  举报