Mysql 游戏排名

Mysql 游戏排名,mysql,ranking,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

我有一份得分很高的球员名单。如果我的名字是“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 ;

实现这一点的一种方法是使用临时表:

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;
DROP TEMPORARY TABLE ranked_players;
如果要确保具有相同
高分的玩家顺序一致,您可能需要添加
id
playername

现在需要计算播放器的排名(注意MySQL不允许在同一个查询中使用临时表两次,因此不能将其放入下一条语句的子查询中):

然后,您需要获得排名从2位到2位的玩家范围:

SELECT players.*
FROM players
JOIN ranked_players USING (id)
WHERE rank BETWEEN (@myrank - 2) AND (@myrank + 2)
ORDER BY highscore DESC;
然后清理临时表:

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;
DROP TEMPORARY TABLE ranked_players;
最后,如果在实际表中预先计算具有
的用户列表,只要对应用程序有意义,就可以刷新该列表(我认为这是性能和实时性之间的折衷),那么可以将其简化为单个查询。然后您将使用的查询可以很容易地从上面的查询派生出来,不同之处在于您不受我提到的临时表的限制