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

hpxqektj  于 2021-06-20  发布在  Mysql
关注(0)|答案(3)|浏览(269)

我想在我的查询中建立一个排名列——我在堆栈中发现了一些类似的情况,但这个有点不同,我不能完全让它工作。我有一个表,enrollmentx,有两列,一个惟一的studentid和一个groupid(为了便于讨论,groups 1:3)。我需要同时计算这三个小组中每个小组的学生人数,然后按学生人数对小组进行排名。我已经数到了:

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

这将显示两列,一列为groupid,1:3,另一列为studentcnt,每个组中的学生数正确。我无法解决的是如何在构建studentcnt列之后使用它来创建第三个排名列。

im9ewurl

im9ewurl1#

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

3duebb1j2#

尝试此查询:

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
wvmv3b1j

wvmv3b1j3#

试试看。。

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

相关问题