0

我有一个高分游戏中的玩家列表。如果我的名字是“jimbo”,我想得到我的分数,并得到我的排名位置和排名中仅次于我的人,好 2 位,差 2 位。

CREATE TABLE `players` (
  `id` bigint(100) NOT NULL AUTO_INCREMENT,
  `playername` varchar(15) NOT NULL,
  `email` varchar(300) NOT NULL,
  `highscore` bigint(100) NOT NULL,
  PRIMARY KEY (`id`)
 ENGINE=MyISAM  DEFAULT CHARSET=latin1 AUTO_INCREMENT=106 ;
4

1 回答 1

1

实现此目的的一种方法是使用临时表:

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只要对您的应用程序有意义,您就会刷新(我想这是性能和实时之间的折衷 -尼斯)。您随后使用的查询可以很容易地从上述查询中派生出来,不同之处在于您不受我提到的临时表的限制。

于 2012-05-09T09:48:24.860 回答