首页 > 数据库 > mysql教程 > 如何在 MySQL 中对组内数据进行排名?

如何在 MySQL 中对组内数据进行排名?

Mary-Kate Olsen
发布: 2025-01-17 19:51:10
原创
155 人浏览过

How to Rank Data Within Groups in MySQL?

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>
登录后复制

此查询包含以下步骤:

  1. 变量初始化: 两个用户变量 @student@class 初始化为 0。

  2. 逐行处理: 外层查询按 ORDER BY 子句指定的顺序(id_classgrade DESCid_student)处理结果集的每一行。 注意这里排序使用了 grade DESC,确保成绩高的学生排名靠前。

  3. 组内排名: CASE 语句检查当前 id_class 是否与前一个 id_class (@class) 相同。如果相同,则将 @student 加 1;否则,将 @student 重置为 1。这确保了 rn 值(排名)在每个组(id_class)内是唯一的。

  4. 分组赋值: @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中文网其他相关文章!

来源:php.cn
本站声明
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn
作者最新文章
热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板