学⽣成绩管理系统MySql语句查询学⽣最终成绩(最新成绩)
学⽣成绩管理系统 MySql语句查询学⽣最终成绩\最新成绩
说明
学⽣成绩管理⼀直是学⽣管理系统中的⼀个⼤头,因为重修\补考等机制,所以使⽤操作命令的格式存储的课程成绩就会由于时间的不同⽽导致该课程会有多项成绩,但我们期望每个课程的成绩是唯⼀的,也就是只取最后⼀次成绩。
假设有数据表格如下表所⽰:
数据表格
id stuId courseId grade time
111802021-4-27
212402021-4-28
313992021-4-27
411702020-4-27
512672020-4-27
612902022-4-29
我们期望经过查询后可以获得下表数据。
期望数据
id stuId courseId grade time
111802021-4-27
313992021-4-27
612902022-4-29
问题解决⽅案推导
尝试⼀:查询学⽣的数据后,再对时间进⾏倒序排序,再利⽤Group By
# select * from testinfo where stuId=@stuid ORDER BY time
select id,stuid,courseId,grade,time from
(select*from testinfo where stuId=@stuId ORDER BY time desc)as a
group by courseId;
查询结果
id stuId courseId grade time
111802021-4-27
212402022-4-28
313992021-4-27
看到第⼆条的时候,问题出来了,是没有排序直接就分组处理了吗?答案是是的。
group by 和 order by ⼀起使⽤时,会先使⽤group by 分组,并取出分组后的第⼀条数据,所以后⾯的order by 排序时根据取出来的第⼀条数据来排序的,但是第⼀条数据不⼀定是分组⾥⾯的最⼤数据。
使⽤⽂中介绍的⽅法经过测试后,结果也不是需求⽬标,应该是不适⽤于我们想要的问题类型,所以只能转换思路。
尝试⼆:两表连接查询
其中⼀个表查询到所有指定学⽣的成绩记录,另⼀个表则是使⽤gourp by查询到id,课程和考试时间三个重要因素即可。
# 查询该学⽣所有课程
# select * from testinfo where stuId=@stuid;
# 查询该学⽣每门不同的课程最后的考试时间
# select courseId,max(time) from testinfo where stuId=@stuid group by courseId;
# 连接两表,查询出最终成绩
select*from(select*from testinfo where stuId=@stuid) a,
(select courseId,max(time)time from testinfo where stuId=@stuid group by courseId) b
urseId = b.courseId and a.time=b.time;mysql下载哪个版本好2022
查询结果
id stuId courseId grade time
111802021-4-27
313992021-4-27
612902022-4-29
此时则我们获得了期望数据。
但是,由于连接查询的原因,如果数据量过⼤时,该⽅法会导致查询速度过慢,不过学⽣学期的课程⼀般最多不会超过50门,考试次数不会超过50*4次(对于⼤学⽣⽽⾔),属于⼩数据。
分析
总体来说还是解决了查询上的问题,但是效率上并不是特别美好,只是⽬前对于我的需求是⾜够的,就没有继续研究效率更好的解决办法。如果有更好的解决办法,还望不吝赐教。
1.
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论