作为数据库管理员,您可能需要对分组数据集中的项目进行排名。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;
此查询分步骤操作:
id_class
排序,然后按 grade
降序排序。@student
和 @class
初始化为 -1。@class
用于确定是否进入新组。如果存储在 @class
中的 id_class
的先前值与当前 id_class
不同,则 @student
重置为 0。否则,它递增。@class
被赋予 id_class
的新值,并将用于查询的下一次迭代。rn
计算为每个组内的排名。 注意,为了保证排名正确,内部查询需要按照 id_class
和 grade
降序排序。这个修改后的查询更清晰地展示了如何使用变量来实现分组排名,并修正了原查询中的一些逻辑错误,确保排名结果的准确性。 关键在于 CASE WHEN
语句的条件判断,以及对 @student
和 @class
变量的正确更新。
以上是如何在MySQL中使用子查询和变量进行分组排名?的详细内容。更多信息请关注PHP中文网其他相关文章!