mysql分组limit_mysql 分组+排序+限定

现在有个有意思的状况,在用户登录成功的时候 ,要显示用户上一次登录的信息,时间和IP等。可是在用户登录信息表中,并不会记录用户的登录过程,只记录的账号密码这些基础信息,用户的操作全部记录在日志表中。

还有,在用户登录成功的时候,会自动想日志表中添加一条记录,在前两天的触发器部分已经解决了这个问题。那么,我们需要做三件事:

1:在log表中找到该用户的所有登录记录

2:按照时间降序排序

3:找到第二行记录,并返回。

为什么是第二行,因为第一行是用户当前登录的信息,第二行才是上次登录的信息。

先创建简单的日志表,时间还是用timestamp类型,不需要自己进行添加。content存储操作类型,比如说 login logout

create table log(

idint not null primary keyauto_increment,

operationTimetimestamp,

contentvarchar(20),user_id int)

插入记录,我并没有一次全部插入,操作之间是有时间分隔的。

insert into log(content,user_id) values('login',2);insert into log(content,user_id) values('login',4);insert into log(content,user_id) values('logout',4);insert into log(content,user_id) values('logout',2);insert into log(content,user_id) values('login',2);insert into log(content,user_id) values('logout',2);insert into log(content,user_id) values('login',2);

7d90fcb76a1d6355ef8f2908c0143638.png

通过上表我们能看到,用户2 登录 登出 登录 登出 然后再登录。假设最后一次登录是用户2正在执行的操作,我们要显示上一次的登录信息,就必须把id为5的内容获取到。看到这我们发现,可以不对时间进行排序,对id进行排序也是可以的。

1:分组 group by

361560d34780ac3fd91f7a9ea369062d.png

我们能看到,是通过user_id分成了两组,每组都显示分组后的第一条记录,显然这个是满足不了我们的需求的。我们需要得到user_id=2这组的所有内容。

2:where字句

其实用不到分组,我们可以通过where字句来获取具体的内容。

6ab345779e8527b8ee4c0435f491e2f0.png

where ··· and ··· 我们就能得到用户2的所有login操作的内容了。

3:排序 order by

3a257a109bef125ac678a50aaeef372e.png

desc 是降序 asc是升序。语法也很简单。

现在我们得到了如上的内容,接下来需要得到第二行记录。

4:限定 limit

60430a8df1726d0d75567b1ad6ad5b7d.png

报错了,说table要有别名。那给table加上个别名看看。

113c15ee6a8b724e2c6fdf314cd61d09.png

终于如愿以偿的得到第二行记录了。再看看我们输入了什么命令

select * from (select * from log as l where l.user_id=2 and l.content='login' order by id desc) as lo limit 1,1;

(select * from log as l  where l.user_id=2 and l.content='login' order by id desc)是得到了一个表,然后我们在这个表的基础上再进行查询。

limit n,m 是说从 0开始,找到n 到 m之间的记录。我们只需要第二条记录,所以是limit 1,1。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值