mysql - mysql中如何计算排名?

标签 mysql

我有一个表“student_marks”,其中包含两列“student_id”和“mark”:

student_id | marks
-------------------
    1      |  5
    2      |  2
    3      |  5
    4      |  1
    5      |  2

我需要计算与分数对应的排名。上表的预期输出是:

student_id | marks  | rank
-------------------------
    1      |  5     | 1
    2      |  2     | 3
    3      |  5     | 1
    4      |  1     | 5
    5      |  2     | 3

由于 Students_id 1 和 3 的两名学生得分最高为 5,因此他们被排在第 1 名。对于得分为 2 的学生,排名为 3,因为有两名学生的得分比这些人更高。

我们如何编写查询来计算如上所示的排名?

最佳答案

虽然变量很大,但应该可以工作。

SELECT student_id, mark, rank FROM (
    SELECT t.*,
           @rownum := @rownum + 1 AS realRank,
           @oldRank := IF(mark = @previous,@oldRank,@rownum) AS rank,
           @previous := mark
    FROM student_marks t, 
         (SELECT @rownum := 0) r,
         (SELECT @previous := 100) g,
         (SELECT @oldRank := 0) h
    ORDER BY mark DESC
 ) as t
 ORDER BY student_id;

看看这个 fiddle :http://sqlfiddle.com/#!2/2c7e5/32/0

关于mysql - mysql中如何计算排名?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11072172/

相关文章:

php - 存储在 php 中的日期时间

mysql - 一个条目中有多个值

mysql - 选择每个用户最近日期的行

php - 代码不适用于网络托管,但适用于本地主机

php - PHP MySQL 中的 SELECT 日期时间等于今天

php - date_add 或 date_sub 速度差异?

MySQL计算其他两个计算总和(包括按月分组)的百分比

mysql - 无法换卡

MySQL 查询返回空

python - Docker 组合多个容器