Mysql 更改查询以获得类似于MSSQL秩函数的结果
我已经修改了@mukhesh_soni和@salman_A所回答的查询,以获得与MSSQL RANK()函数类似的结果,我的查询如下: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
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。第二个问题是运算符优先级。