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

(学生表)

(班级表)

(成绩表)

解题:


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:我们已经拿到各课程的最高分数据,在等值连接后会将其他的班级匹配数据拿回来,所有还要再次过滤其他数据,筛选一班数据)

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

qq_34701838

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值