比赛排名位置

时间:2012-05-09 09:37:51

标签: mysql ranking

我有一个高分的游戏中的玩家列表。我希望得到我的分数,如果我的名字是“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 ;

1 个答案:

答案 0 :(得分: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的玩家的一致排序,您可能需要添加playernamehighscore

现在你需要弄清楚播放器的等级(注意MySQL不会允许你在同一个查询中使用两次临时表,因此不能将它放在下一个语句的子查询中):< / p>

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的用户列表,并且只要对应用程序有意义就会刷新,那么您可以将其减少为单个查询(我想这是一个在性能和实时性之间做出妥协。您之后使用的查询可以很容易地从上面的查询中得出,不同之处在于您不受我提到的临时表的限制。