MySQL分组排名详解
在某些场景下,需要根据分组对数据进行排名,而不仅仅依赖单个字段。例如,假设有一个学生表,包含学生ID、班级ID和成绩,如下所示:
ID_STUDENT | ID_CLASS | GRADE |
---|---|---|
1 | 1 | 90 |
1 | 2 | 80 |
2 | 1 | 99 |
3 | 1 | 80 |
4 | 1 | 70 |
5 | 2 | 78 |
6 | 2 | 90 |
6 | 3 | 50 |
7 | 3 | 90 |
为了根据成绩对每个班级中的学生进行排名,可以使用以下MySQL查询:
<code class="language-sql">SELECT id_student, id_class, grade, @student:=CASE WHEN @class = id_class THEN @student+1 ELSE 1 END AS rn, @class:=id_class AS clset FROM (SELECT @student:= 0) s, (SELECT @class:= 0) c, (SELECT * FROM mytable ORDER BY id_class, grade DESC, id_student ) t</code>
此查询包含以下步骤:
变量初始化: 两个用户变量 @student
和 @class
初始化为 0。
逐行处理: 外层查询按 ORDER BY
子句指定的顺序(id_class
,grade DESC
,id_student
)处理结果集的每一行。 注意这里排序使用了 grade DESC
,确保成绩高的学生排名靠前。
组内排名: CASE
语句检查当前 id_class
是否与前一个 id_class
(@class
) 相同。如果相同,则将 @student
加 1;否则,将 @student
重置为 1。这确保了 rn
值(排名)在每个组(id_class
)内是唯一的。
分组赋值: @class
赋值为当前 id_class
,将在下一行进行比较。
此查询的输出将提供所需的学生分组排名:
ID_STUDENT | ID_CLASS | GRADE | RANK |
---|---|---|---|
2 | 1 | 99 | 1 |
1 | 1 | 90 | 2 |
3 | 1 | 80 | 3 |
4 | 1 | 70 | 4 |
6 | 2 | 90 | 1 |
1 | 2 | 80 | 2 |
5 | 2 | 78 | 3 |
7 | 3 | 90 | 1 |
6 | 3 | 50 | 2 |
以上是如何在 MySQL 中对组内数据进行排名?的详细内容。更多信息请关注PHP中文网其他相关文章!