Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/57.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/78.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何在MySQL中为不同的列创建排名?_Mysql_Sql - Fatal编程技术网

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

如何在MySQL中为不同的列创建排名?,mysql,sql,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 -- --- ------ --

我有下表:

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

我在这里找到了几种向表中添加排名的解决方案,但是如何在考虑其他列的值的情况下创建排名?

在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))
fiece.

和排名基于什么?也可能是重复的