mysql查询每门课程成绩最好的前两名
封面图
•
2025-12-22
•
MySQL
258
0
0
0
在 MySQL 中,如果要查询每门课程成绩最好的前两名,可以使用窗口函数 `ROW_NUMBER()` 或 `RANK()` 来实现。假设你有一个表结构如下: ### 表结构示例: ```sql CREATE TABLE scores ( id INT PRIMARY KEY AUTO_INCREMENT, student_id INT, course_id INT, score DECIMAL(5,2) ); ``` ### 查询每门课程成绩最好的前两名: ```sql SELECT * FROM ( SELECT *, ROW_NUMBER() OVER (PARTITION BY course_id ORDER BY score DESC) AS rank FROM scores ) AS ranked WHERE rank <= 2; ``` ### 说明: - `PARTITION BY course_id`:按课程分组。 - `ORDER BY score DESC`:按分数降序排列。 - `ROW_NUMBER()`:为每组中的记录分配一个行号(1、2、3...)。 - 最外层的 `WHERE rank <= 2`:只取每门课程中排名前二的记录。 --- ### 如果你使用的是 **MySQL 8.0 以下版本**(不支持窗口函数),可以用子查询结合 `LIMIT` 实现: ```sql SELECT s.* FROM scores s WHERE ( SELECT COUNT(*) + 1 FROM scores s2 WHERE s2.course_id = s.course_id AND s2.score > s.score ) <= 2; ``` 这个查询的逻辑是:对每个学生的分数,统计比他高的分数数量,如果小于等于 2,就表示他是前两名之一。 --- ### 示例数据和结果: 假设 `scores` 表中有如下数据: | id | student_id | course_id | score | |----|------------|-----------|-------| | 1 | 101 | 1 | 90 | | 2 | 102 | 1 | 85 | | 3 | 103 | 1 | 95 | | 4 | 104 | 2 | 88 | | 5 | 105 | 2 | 92 | | 6 | 106 | 2 | 80 | 查询结果会是: | id | student_id | course_id | score | |----|------------|-----------|-------| | 3 | 103 | 1 | 95 | | 1 | 101 | 1 | 90 | | 5 | 105 | 2 | 92 | | 4 | 104 | 2 | 88 | --- 如果你有具体的表结构或字段名,请告诉我,我可以帮你定制更精确的 SQL 语句。
上一篇:
mysql查询选修 张三 老师所授课程的学生中成绩最高的学生姓名及其成绩
下一篇:
说说 MySQL和 MongoDB的区别
标题录入,一次不能超过6条
留言
评论