2010-04-12 54 views
3

我正在使用MySQL數據庫來存儲我的遊戲的分數。表中的一個非常簡化的版本將是如何形成一個最佳查詢從數據庫中獲得高分?

(PlayerID - INT) (名稱 - 字符串) (得分 - INT)

我想形成一個查詢將返回我一套發言權感興趣的玩家位於桌子中間的10個結果。

也許一個例子會使它更清晰。

我剛剛取得了高分,我的名字是史蒂夫。當我看高分表時,我想看到我下面的5分和我上面的5分。顯然,如果我有最高分,我會看到我下面的9個分數,相反,如果我在最下面,我會看到9分以上的分數。分數表可能包含數千分數。

由於數據庫是專門爲查詢數據集而設計的,因此我想減少結果後處理的數量。

有沒有人有一個想法來實現這個查詢?

感謝 豐富

回答

2

,如果您有用戶ID和分數(用戶ID和userScore),你可以這樣做:

SELECT * FROM Scores 
WHERE PlayerID = userId 
OR PlayerID IN (SELECT PlayerID FROM Scores WHERE Score > userScore ORDER BY Score LIMIT 5) 
OR PlayerID IN (SELECT PlayerID FROM Scores WHERE Score < userScore ORDER BY Score DESC LIMIT 5) 
ORDER BY Score 

編輯:按照你的意見:所有的 首先,你需要了解當前用戶的排名。你可以通過如下查詢知道它:SELECT COUNT(*) FROM Scores WHERE Score > userScore
它給你一個數字 然後你計算userUp和userDown這兩個數字, )FROM成績

然後你可以使用UNION而不是與子查詢:

SELECT * FROM Scores WHERE PlayerID = userId 
UNION 
SELECT * FROM Scores WHERE Score > userScore ORDER BY Score LIMIT usersUp 
UNION 
(SELECT * FROM Scores WHERE Score < userScore ORDER BY Score LIMIT usersDown) 

,如果你想留在MySQL服務器端,您可以收集所有的存儲過程中

+0

輝煌謝謝您。 – Rich 2010-04-12 11:07:08

+0

@你有沒有想過當用戶擁有最高分時想要發生什麼? – thecoshman 2010-04-12 11:11:59

+0

-1。它確實回答了一個問題,但沒有回答上述問題。 – erikkallen 2010-04-12 11:16:00

相關問題