首页 > 解决方案 > 从 MySQL 中的查询列创建排名列

问题描述

我想在我的查询中建立一个排名列——我在 Stack 上发现了一些类似的案例,但这个有点不同,我不能让它工作。我有一个表 EnrollmentX,它有两列,一个唯一的 StudentID 和一个 GroupId(为了论证,组 1:3)。我需要同时计算这三个组中每个组的学生人数,然后按学生人数对这些组进行排名。就计数而言,我已经做到了:

SELECT
   EnrollmentX.GroupId,
   COUNT(EnrollmentX.StudentId) AS StudentCnt
FROM EnrollmentX
GROUP BY
   EnrollmentX.GroupId

这会输出两列,一列用于 GroupId,1:3,另一列用于 StudentCnt,每个组中的学生人数正确。我无法解决的是如何在构建该 StudentCnt 列之后使用它来创建第三个排名列。

标签: mysqlmysql-8.0

解决方案


如果您使用的是 mysql 8,则有更多可读选项。如果您想要不同的等级,请更改内部查询中的顺序。

SELECT GroupId, StudentCnt, @Rank:=@Rank + 1 AS rank FROM
(SELECT EnrollmentX.GroupId,
       COUNT(EnrollmentX.StudentId) AS StudentCnt
    FROM EnrollmentX
    GROUP BY
       EnrollmentX.GroupId
ORDER BY StudentCnt DESC
) x CROSS JOIN (SELECT @Rank:=0) y

推荐阅读