实现此目的的一种方法是使用临时表:
CREATE TEMPORARY TABLE ranked_players AS
SELECT id, playername, @rownum:=@rownum+1 AS rank
FROM players
JOIN (SELECT @rownum:=0) AS RANK
ORDER BY highscore DESC;
您可能想要添加id
,或者playername
如果您想确保具有相同highscore
.
现在您需要计算玩家的排名(注意 MySQL 不允许您在同一查询中使用临时表两次,因此不能将其放入下一条语句的子查询中):
SELECT rank
INTO @myrank
FROM ranked_players
WHERE playername = 'jimbo';
然后,您需要获得排名从 2 位到 2 位以下的玩家范围:
SELECT players.*
FROM players
JOIN ranked_players USING (id)
WHERE rank BETWEEN (@myrank - 2) AND (@myrank + 2)
ORDER BY highscore DESC;
然后清理临时表:
DROP TEMPORARY TABLE ranked_players;
最后,如果您使用实际表中的用户列表预先计算用户列表,则可以将其减少为单个查询,rank
只要对您的应用程序有意义,您就会刷新(我想这是性能和实时之间的折衷 -尼斯)。您随后使用的查询可以很容易地从上述查询中派生出来,不同之处在于您不受我提到的临时表的限制。