mySQL排名与下一个更高的数字

除了第一条记录总是丢失,无论它是如何获取的,Ties的排名都能正常工作.试图从低到高排名.

SELECT x.*, 
COUNT(*) AS myRank 
FROM myTablename x 
JOIN myTablename y 
ON x.number > y.number 
GROUP BY id  
ORDER BY myRank 

很高兴地说,在一场长时间的战斗之后,以下的修订工作正如预期的那样!

SELECT x.*, 
Count(y.id)+1 AS myRank
FROM myTablename x 
LEFT JOIN myTablename y 
ON (x.number > y.number) 
GROUP BY x.id 
ORDER BY myRank

结果:

ID  #   Rank
A  -50  1
B  -40  2
C  -40  2
D  -30  4
E  -30  4

将“=”添加到… ON x.number> = y.number …获得关系正确的排名,除了绑定的记录排名到下一个更高的数字.

ID  #   Rank
A  -50  1
B  -40  3
C  -40  3
D  -30  5
E  -30  5

使用ON x.number< = y.number从高到低排名做同样的事情.

最佳答案 这是一个没有自连接的版本,而是使用变量.它最有可能也更快:

select id, points, rank from (
select
t.*,
@rownum := @rownum + 1,
@rank := if(@prev_points = points, @rank, @rownum) as rank,
@prev_points := points
from
test t,
(select @rank:=0, @rownum:=0, @prev_points) var_init
order by points desc
)sq

>看到它在sqlfiddle的现场工作

点赞