2012-06-17 57 views
2

我有一个表“student_marks”有两列“student_id数据”和“标志”:如何在mysql中计算排名?

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,因为有两名学生谁拥有更多的分数,然后这些家伙。

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

+0

相关:http://stackoverflow.com/questions/1895110/row-number-in-mysql –

+0

你SO发布之前搜索? –

+0

如果您查看上述问题中的预期等级列,则不存在等级2.这是因为有两个等级为1的人。我正在查询一种方法来获得上述问题中的等级(1,3,1,5 ,3)而不是(1,2,1,3,2)。 – sushil

回答

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; 

看看这个小提琴:http://sqlfiddle.com/#!2/2c7e5/32/0

+0

这在MySQL中很危险。请参阅:http://dev.mysql.com/doc/refman/5.0/en/user-variables.html - “一般来说,您不应该为用户变量赋值并读取相同的值声明。” – goat

+0

我是否避免这种情况:“为避免此行为的问题,请不要将值分配给单个语句中的相同变量的值并读取其值,要么将该变量设置为0,0.0或'来定义它的类型在你使用它之前。“ – jpiasetz

+0

它们指的是该报价中列的结果类型。我指的是他们在select子句中假设执行语句的警告。 – goat