写这篇博文是为了帮助遇到同样问题的人,希望对你有用~
问题:求怎么查出同一课程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^