我有一个高分的游戏中的玩家列表。我希望得到我的分数,如果我的名字是“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 ;
答案 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
的玩家的一致排序,您可能需要添加playername
或highscore
。
现在你需要弄清楚播放器的等级(注意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
的用户列表,并且只要对应用程序有意义就会刷新,那么您可以将其减少为单个查询(我想这是一个在性能和实时性之间做出妥协。您之后使用的查询可以很容易地从上面的查询中得出,不同之处在于您不受我提到的临时表的限制。