Mysql 查询每个班级的前几名
# AI 解析
在 MySQL 5.7 中,由于不支持 ROW_NUMBER()
函数,我们可以使用变量来实现类似的功能。以下是一个示例,展示如何在 MySQL 5.7 中查询每个班级的前三名学生:
假设有一个名为 students
的表,包含以下列:id(学生编号)、class(班级)、name(学生姓名)和 score(分数)。
- 创建示例数据
CREATE TABLE students (
id INT PRIMARY KEY,
class VARCHAR(20),
name VARCHAR(50),
score INT
);
INSERT INTO students (id, class, name, score) VALUES
(1, 'ClassA', 'Alice', 85),
(2, 'ClassA', 'Bob', 90),
(3, 'ClassA', 'Charlie', 88),
(4, 'ClassA', 'David', 92),
(5, 'ClassA', 'Eve', 87),
(6, 'ClassB', 'Frank', 80),
(7, 'ClassB', 'Grace', 85),
(8, 'ClassB', 'Heidi', 82),
(9, 'ClassB', 'Ivan', 88),
(10, 'ClassB', 'Judy', 90);
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
- 查询每个班级的前三名学生:
SET @rank := 0;
SET @class := '';
SELECT id, class, name, score
FROM (
SELECT id, class, name, score,
@rank := IF(@class = class, @rank + 1, 1) AS rank,
@class := class
FROM students
ORDER BY class, score DESC
) AS ranked_students
WHERE rank <= 3;
1
2
3
4
5
6
7
8
9
10
11
12
2
3
4
5
6
7
8
9
10
11
12
解释:
- 使用变量 @rank 和 @class 来跟踪每个班级的排名。
- IF(@class = class, @rank + 1, 1):如果当前记录的班级与前一记录的班级相同,则排名加 1;否则,排名重置为 1。
- 外层查询过滤出排名小于等于 3 的记录,即每个班级的前三名学生。
# 拓展
如果不想写 SET XXX
这段语法,可以把定义变量,放到一个临时表中。
SELECT id, class, name, score
FROM (
SELECT id, class, name, score,
@rank := IF(@class = class, @rank + 1, 1) AS rank,
@class := class
FROM students, (SELECT @rank := 0, @class := '') AS temp
ORDER BY class, score DESC
) AS ranked_students
WHERE rank <= 3;
1
2
3
4
5
6
7
8
9
2
3
4
5
6
7
8
9
这段语句,把变量定义存在了临时表中。依赖的特性是 SQL 的执行顺序。
我自测得出的结论是: FROM => SELECT => WHERE
;
以下语句大家可以自行调试;
SET @num := 0;
SELECT @num := 1
FROM (SELECT @num := 2) temp
WHERE 1 > (SELECT @num := 3);
SELECT @num;
1
2
3
4
5
6
7
2
3
4
5
6
7
编辑 (opens new window)
上次更新: 2024/07/20, 15:20:56