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