Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/unity3d/4.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 更改查询以获得类似于MSSQL秩函数的结果_Mysql - Fatal编程技术网

Mysql 更改查询以获得类似于MSSQL秩函数的结果

Mysql 更改查询以获得类似于MSSQL秩函数的结果,mysql,Mysql,我已经修改了@mukhesh_soni和@salman_A所回答的查询,以获得与MSSQL RANK()函数类似的结果,我的查询如下: SELECT id, rank_column, @curRank := IF(@prevVal=rank_column, @curRank, @studentNumber) AS rank, @studentNumber := @studentNumber + 1 as studentNumber, @prevVal:=rank_column FROM r

我已经修改了@mukhesh_soni和@salman_A所回答的查询,以获得与MSSQL RANK()函数类似的结果,我的查询如下:

SELECT id, rank_column, 
@curRank := IF(@prevVal=rank_column, @curRank, @studentNumber) AS rank, 
@studentNumber := @studentNumber + 1 as studentNumber, 
@prevVal:=rank_column
FROM rank_table, (
SELECT @curRank :=0, @prevVal:=null, @studentNumber:=1
) r
ORDER BY rank_column 
但查询也会在结果中返回@studentNumber和@prevVal。我怎么能省略这两个,或者在PHP中忽略它们

salman_A给出的答案类似于MSSQL DENSE_RANK(),其中我需要RANK(),只是在结果中省略了上面两个不必要的列

天哪,
densite\u rank()
row\u number()
会更容易些。让我们看看能不能做到。摆脱
prevval
既简单又值得推荐:

SELECT id, rank_column, 
       @curRank := IF(@prevVal = rank_column,
                      @curRank,
                      if(@prevVal:=rank_column, @studentNumber, @studentNumber)
                     ) AS rank, 
       @studentNumber := @studentNumber + 1 as studentNumber
FROM rank_table CROSS JOIN
     (SELECT @curRank :=0, @prevVal:=null, @studentNumber:=1) vars
ORDER BY rank_column ;
建议这样做,因为MySQL不保证
select
子句中表达式的求值顺序。变量赋值可以按任何顺序进行。这是可以修正的,但它会产生梅西耶条款。我们只需要一个包含所有变量的表达式。您可以这样做:

SELECT id, rank_column, 
       @curRank := IF((@studentNumber := @studentNumber + 1) >= 0,
                      if(@prevVal = rank_column,
                         @curRank,
                         if(@prevVal:=rank_column, @studentNumber, @studentNumber)
                        ),
                      NULL) AS rank
FROM rank_table CROSS JOIN
     (SELECT @curRank := 0, @prevVal := null, @studentNumber := 0) vars
ORDER BY rank_column ;

请注意,我将初始值更改为
0
,因为该值在使用前会递增。

您只需将其包装到另一个SELECT语句中,该语句仅从“内部”中选择所需的列选择…如果这是唯一的解决方案,那么在完成请求所需的时间方面,使用SELECT INDER SELECT的结果将远远好于在PHP中忽略它们?最简单的事情就是在PHP中忽略它们。在PHP中忽略它们不是自动发生的吗?您的PHP将只访问您关心的列。如果数据库支持现代SQL功能,这将非常容易。谢谢@gordon linoff。第一个查询的输出是StudentNumber,但没有问题,第二个查询为每行分配秩1。@RajanSharma。第二个问题是运算符优先级。