SQL分组取最大值的方法

写这篇博文是为了帮助遇到同样问题的人,希望对你有用~

问题:求怎么查出同一课程id中时间最大的记录?(如下图所示)


1、刚开始想通过group by 分组课程id, 然后获取最大值,如下:

SELECT MAX(l.learn_time)
FROM learn l
where l.user_id = '14201109' 
GROUP BY l.course_id

查出来结果如下:


但是我想要查出来所有的字段,于是select后面加上 learn.*,嗯,应该没问题了,如下:

SELECT MAX(l.learn_time), l.*
FROM learn l
where l.user_id = '14201109' 
GROUP BY l.course_id

但查出来的结果出乎我的意料,你是不是也没想到,两列的时间字段竟然不一样!!!

由此想 MAX(l.learn_time)最大时间 应该是和 后面的learn.*记录没有直接关系的。


一开始是这样想的,通过时间逆排序,

select learn.*
from learn
where	learn.user_id = '14201109'
ORDER BY learn.learn_time DESC

然后在通过课程id分组应该就可以获取到了,但是排序order by必须放在分组group by 之后,像下面这样

select learn.*
from learn
where	learn.user_id = '14201109'
GROUP BY course_id
ORDER BY learn.learn_time DESC

结果发现learn_id 是1和6,通过group by分组之后它就只能取到的是这两条,这两条记录恰恰是时间最小的,而我们想要的是learn_id 为5和9的最大时间,经过这一番折磨,实在不知道怎么解决了,发了个求救信息,不一会儿,在同学的帮助下,就解决了只个问题,其实刚开始的思路是对的,就是先查到最大时间,再外边嵌套查询就好了,如下:

正确答案:

SELECT *
from learn
where learn.learn_time in (
			SELECT MAX(l.learn_time)
			FROM learn l
			where l.user_id = '14201109' 
			GROUP BY l.course_id
)

其实刚开始我也这样想过,但是我是把in写的等号“=”,结果一直报错说内嵌套只能查出来一条记录才可以,当时脑子短路,咋就没想到用in【/捂脸】【/捂脸】【/捂脸】,希望你们不要像我一样犯同样的错误。

突然想起来忘了说,我用的是mysql数据库


最后,大家觉得我写的还可以的话,给个赞呗,关注下也可以的哦^v^




猜你喜欢

转载自blog.csdn.net/qq_37811638/article/details/80055684