1、分组 GROUP BY - 基于MYSQL
DB中存在各个学生每个月的成绩,要求只查询获取学生最新一个月的成绩。
DB 表:
student{id, name, age}
score{
id;
student_id;
score;
month("yyyy-MM");
}
思路:子查询先将学生student_id和 日期month 两个字段进行分组,然后对月份进行排序,再外层循环做学生student_id 进行一次分组,即可。
疑问点:为什么不能只做子查询对学生student_id和 日期month 两个字段进行分组,而再需要对学生id 进行一次分组?和group by 的机制有关?(尝试了一遍,这样操作获取的数据并不是最新一个月的)
实现SQL:
SELECT * FROM (SELECT * FROM score WHERE GROUP BY student_id, month ORDER BY month DESC) sc GROUP BY sc.student_id
或 查询某一学生最近的成绩
SELECT * FROM (SELECT * FROM score WHERE student_id = 'test_id' GROUP BY student_id, month ORDER BY month DESC) sc GROUP BY sc.student_id
缺点:
此种表设计及查询方式,数据量大的时候,会造成性能问题,如查询计划执行情况:
优化方向:
在表中新增一个字段,标识数据新旧标识,此时的执行计划,如下:
n、未完待续…