首页 > 数据库 > mysql教程 > 如何在MySQL中使用子查询和变量进行分组排名?

如何在MySQL中使用子查询和变量进行分组排名?

Susan Sarandon
发布: 2025-01-17 19:46:09
原创
562 人浏览过

How to Perform Grouped Ranking in MySQL Using Subqueries and Variables?

MySQL 分组排名详解

引言

作为数据库管理员,您可能需要对分组数据集中的项目进行排名。MySQL 提供了一种便捷的方法,可以使用子查询和临时变量组合来执行分组排名。

问题场景

考虑以下表格:

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

目标是在每个班级内对学生进行排名,得到以下输出:

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 中执行分组排名,您可以使用以下查询:

SELECT id_student, id_class, grade,
   @student:=CASE WHEN @class = id_class THEN @student+1 ELSE 0 END AS rn,
   @class:=id_class AS clset
FROM
  (SELECT @student:= -1, @class := -1) s,
  (SELECT *
   FROM mytable
   ORDER BY id_class, grade DESC
  ) t;
登录后复制

解释

此查询分步骤操作:

  1. 初始查询首先按 id_class 排序,然后按 grade 降序排序。
  2. 临时变量 @student@class 初始化为 -1。
  3. @class 用于确定是否进入新组。如果存储在 @class 中的 id_class 的先前值与当前 id_class 不同,则 @student 重置为 0。否则,它递增。
  4. @class 被赋予 id_class 的新值,并将用于查询的下一次迭代。
  5. 最后,rn 计算为每个组内的排名。 注意,为了保证排名正确,内部查询需要按照 id_classgrade 降序排序。

这个修改后的查询更清晰地展示了如何使用变量来实现分组排名,并修正了原查询中的一些逻辑错误,确保排名结果的准确性。 关键在于 CASE WHEN 语句的条件判断,以及对 @student@class 变量的正确更新。

以上是如何在MySQL中使用子查询和变量进行分组排名?的详细内容。更多信息请关注PHP中文网其他相关文章!

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