从MySQL中的查询列创建排名列

时间:2018-06-22 07:40:41

标签: mysql mysql-8.0

我想在查询中建立一个排名列-我在Stack上发现了一些类似的情况,但这有些不同,我不能完全使它起作用。我有一个表EnrollmentX,其中有两列,一个唯一的StudentID和一个GroupId(出于参数的考虑,组为1:3)。我需要同时计算这三个组中每一个的学生数量,然后按学生数量对这些组进行排名。就计数而言,我已经做到了:

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

这将显示两列,一列用于GroupId,1:3,一列用于StudentCnt,每组中的学生人数均正确。我无法解决的问题是在建立第3个排名列之后如何使用该StudentCnt列。

3 个答案:

答案 0 :(得分:1)

如果您使用的是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

答案 1 :(得分:1)

尝试此查询:

select ex.GroupId, ex.StudentId, exg.cnt from EnrollmentX ex
left join (
    SELECT GroupId, COUNT(*) cnt 
    FROM EnrollmentX
    GROUP BY GroupId
) exg on ex.GroupId = exg.GroupId
order by exg.cnt

答案 2 :(得分:1)

尝试一下。

SET @Rank = 0;
SELECT @Rank:=@Rank + 1 rank, EnrollmentX.GroupId,
       COUNT(EnrollmentX.StudentId) StudentCnt
    FROM EnrollmentX
    GROUP BY
       EnrollmentX.GroupId
ORDER BY StudentCnt DESC;