除了第一条记录总是丢失,无论它是如何获取的,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的现场工作