2014-02-27 21 views
0

我有這個小問題: 我想使用MySQL爲我的遊戲組織一個top10列表。嗯,實際上它已經可以工作,但我需要爲它添加一個功能。 說,我得到了一個表,其中包含一個名爲「級別」 的字段,例如,數據庫中有一萬名玩家,每個玩家都有自己的等級。所以,要創建一個前十名單我這樣做:TOP 10使用MySQL的玩家列表,顯示玩家的個人位置,即使他不在排行榜上

SELECT `values`.`level` FROM `values` ORDER BY `values`.`level` DESC LIMIT 10 

它工作正常,並給我10個最高水平的球員。但是如果球員本人不在前十名單上呢?他想知道他剩下多少錢才能到達那裏。 讓我們這樣表示: 他看到的分數表顯示了10個最好的玩家,而在桌子底部看到了他自己的記錄,例如你的位置是4023 當然,我可以從MySQL中檢索所有記錄,按順序排列它們降,並使用循環計數的用戶的位置,但隊長明顯是在告訴我,這是不是:-)

最合理的方法,我需要的結果這個樣子的(僅適用於10個用戶,而不是5)

+-------+------+--------+ 
    | level | pos |user | 
    +-------+------+--------+ 
    | 23 | 1 |Alex | 
    | 19 | 2 |John | 
    | 18 | 3 |James | 
    | 16 | 4 |Ashley | 
    | 15 | 5 |Casey | 
    |  |  |  | 
    | 4  | 145 |You  | 
    +-------+------+--------+ 

那麼,有沒有辦法在一個查詢中做到這一點?

謝謝!

+0

請爲您的表結構添加一個'DESCRIBE'或'SHOW CREATE TABLE'! – Kaii

+0

因此,每個玩家對「等級」都有獨特的價值?或者可以有多個玩家擁有相同的等級? –

+0

你可能想看看Rank()函數。這是一個類似的問題。答案可能對你有幫助。 http://stackoverflow.com/questions/3333665/mysql-rank-function – Kevin

回答

0

這是你所期待的。

(
SET @rank=0; 
SELECT 
`values`.`level`, 
@rank:[email protected]+1 AS pos, 
`values`.userID 
FROM 
`values` 
ORDER BY `values`.`level` DESC 
LIMIT 10; 
) 
UNION 
(
SELECT 
v1.`level`, 
COUNT(*) as pos, 
v1.userID 
FROM 
`values` AS v1 
LEFT JOIN 
`values` AS v2 
ON(v1.level < v2.level) 
WHERE v1.userID = 24342 
GROUP BY 1 
) 

我假設在名爲values的表中存在名爲userID的列。

+0

它給出了一個非常奇怪的結果,甚至沒有線索在用戶的位置 – Konstantin

+0

哦!我再次閱讀更新的問題......我之前誤解了這個問題。 – Manu

+0

我已經更新了答案..如果這不起作用,那麼請爲我提供sqlfiddle以解決此問題。 – Manu

2

一個國家可以做到這一點,看到僞代碼的想法

(
SELECT `values`.`level` FROM `values` ORDER BY `values`.`level` DESC LIMIT 10 
UNION 
SELECT `values`.`level` FROM `values` where playerId = loggedPlayerId 
) ORDER BY `values`.`level` 
+0

您可能想要修改第二個'select'以僅顯示最近的分數。 – Zane

+0

此代碼將只返回用戶擁有的級別。這不是我所期待的。我可以輕鬆獲得用戶級別,但我不需要這一點。想象一下:有大量的用戶級別的排序列表。例如1)亞歷克斯 - 等級23,2)詹姆斯 - 等級19,3)約翰 - 等級17 ....145)你 - 等級2 – Konstantin

+0

所以在這個例子中,我正在尋找一種方法來獲得145(或任何可能的數字),只是爲了向用戶展示他在頂級用戶列表上的位置 – Konstantin

0

考慮以下(雖然這會很差擴展在大數據集)......

SELECT * FROM ints; 
+---+ 
| i | 
+---+ 
| 0 | 
| 1 | 
| 2 | 
| 3 | 
| 4 | 
| 5 | 
| 6 | 
| 7 | 
| 8 | 
| 9 | 
+---+ 

SELECT x.* 
    , COUNT(*) rank 
    FROM ints x 
    JOIN ints y 
    ON y.i <= x.i 
GROUP 
    BY x.i 
HAVING rank <=3 
    OR i=7; 
+---+------+ 
| i | rank | 
+---+------+ 
| 0 | 1 | 
| 1 | 2 | 
| 2 | 3 | 
| 7 | 8 | 
+---+------+ 

我懷疑像這樣的東西會更好地擴展...

SELECT * 
    FROM 
    (SELECT i.* 
      , @i:[email protected]+1 rank 
     FROM ints i 
      , (SELECT @i:=0) n 
     ORDER 
      BY i 
    ) x 
WHERE rank <= 3 
    OR i = 7; 

+---+------+ 
| i | rank | 
+---+------+ 
| 0 | 1 | 
| 1 | 2 | 
| 2 | 3 | 
| 7 | 8 | 
+---+------+ 
+0

此代碼的問題是它將返回所有用戶級別。但我只需要10.呃,實際上是11,但是他的位置必須顯示「我的」等級。代碼 + ------- + ------ + -------- + | level | rank | user_id | + ------- + ------ + -------- + | 23 \t | 1 | Alex | | 19 \t | 2 |約翰| | 10 \t | 3 |詹姆斯| | \t | | | | 4 \t | 145 |你| + ------- + ------ + -------- +' – Konstantin

+0

此查詢返回(在此示例中)3(可能的10個)行,以及用戶的等級如果它落在3排範圍之外。 – Strawberry