如何为MySQL中的不同列创建排名?

时间:2014-09-02 14:47:21

标签: mysql sql

我有下表:

id   type   result
---  ---    ------
1    a       39
1    b       412
2    a       42
3    a       32
3    b       390

现在我想在此表中为依赖于类型的结果添加排名,因此每个类型应根据列结果中的值升序一个排名(并且原始表中有大约20种不同的类型) )。

结果应该是这样的:

id   type   result  rank
--  ---    ------   ----
1    a       39     2
1    b       412    2
2    a       42     3
3    a       32     1
3    b       390    1

我在这里找到了几个向表添加排名的解决方案,但是如何根据另一列的值创建排名呢?

1 个答案:

答案 0 :(得分:1)

在MySQL中执行此操作的最简单方法是使用变量:

  select t.*,
         @rn := if(@type = type, @rn + 1,
                   if(@type := type, 1, 1)
                  ) as ranking
  from table t cross join
       (select @type := NULL, @rn := 0) vars
  order by type, result;

请注意,所有变量都在select子句中的单个表达式中使用。这很重要,因为MySQL不保证表达式的评估顺序。因此,if(@type := type, 1, 1))篇。