2012-05-09 108 views
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 ; 

回答

1

的一種方式是通過使用臨時表:

CREATE TEMPORARY TABLE ranked_players AS 
SELECT id, playername, @rownum:[email protected]+1 AS rank 
FROM players 
JOIN (SELECT @rownum:=0) AS RANK 
ORDER BY highscore DESC; 

您可能要添加idplayername如果你想確保玩家用相同的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的用戶列表,則可以將其減少爲單個查詢,只要對您的應用程序有意義即可進行刷新(我認爲這是性能之間的折中和實時性)。然後,您可以很容易地從上面的查詢中派生出查詢,不同之處在於您不受我提到的臨時表的限制。