MySQL同事找我帮忙写的找出一班各科成绩最好的学生

论坛 期权论坛 编程之家     
选择匿名的用户   2021-6-2 15:49   3035   0

(学生表)

(班级表)

(成绩表)

解题:


SET SESSION sql_mode = 'STRICT_TRANS_TABLES';
 
SELECT
 c.id,
 c.course,
 c.score,
 a.classID,
 b.className,
 a.stuName 
FROM
 tablec c
 INNER JOIN tablea a ON c.stuID = a.stuID
 INNER JOIN tableb b ON b.classID = a.classID
 INNER JOIN (
SELECT
 tablec.course,
 MAX( tablec.score ) score
FROM
 tablec
 INNER JOIN ( SELECT stuId FROM tablea, tableb WHERE tablea.classID = tableb.classID AND className = '一班' ) l_a ON tablec.stuID = l_a.stuId 
GROUP BY
 tablec.course 
 ) x ON x.course = c.course 
 AND x.score = c.score 
WHERE
 b.className = '一班';

解题分析:
1、查找一班级大类筛选颗粒度大需要嵌套子查询 inner join (成绩临时表)
2、使用聚合函数max()配合group by分组找出各科目的最高分,但是要通过一班来筛选数据,我们要继续将 (班级表) inner join ( 学生表) 拿到班级里学生的 stuId
3、通过以上的细分筛选后我们拿到了各科目成绩最高的分组数据,group by 得到的数据只能拿到各课程最高分数信息(ps:首先这里分组得到的数据你是拿不到正确的成绩表ID,不懂得可以研究下group by用法。mysql5.6后的分组查询必须在group by使用,或者在select时使用聚合函数)
4、但是这样又有一个问题,筛选出来的数据会有其他班相同匹配课程和成绩的数据被拿出来,所以在最外层还要继续过滤一次一班数据。(ps:我们已经拿到各课程的最高分数据,在等值连接后会将其他的班级匹配数据拿回来,所有还要再次过滤其他数据,筛选一班数据)

分享到 :
0 人收藏
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

积分:3875789
帖子:775174
精华:0
期权论坛 期权论坛
发布
内容

下载期权论坛手机APP