2011-02-25 18 views
2

我有一個遊戲應用,我跟蹤的遊戲每用戶獲得了一些,是這樣的:用戶在表格中的排名位置?

// table: users 
id | username | num_games_won 

我怎麼會告訴用戶他們在num_games_won方面的整體排名?例如:

id | username | num_games_won 
----------------------------------- 
    723  john   203    
    724  mary   1924 
    725  steve   391 

排名可能是:mary-> 0,steve-> 1,john-> 2。給定一個用戶名,我如何找到他們的排名數字? (我用mysql)

感謝

回答

4

試着數有更多的遊戲用戶數贏了你有興趣(由idusername

SELECT COUNT(*) FROM users 
WHERE num_games_won > (SELECT num_games_won FROM users WHERE id = 723) 
+0

哦,這是有道理的 - 如果我已經知道用戶ID,我不需要做子選擇,對吧?此查詢是否會隨着我獲得的用戶數量的降低而嚴重惡化?假設我有1,000,000個用戶,並且正在爲最後一位用戶運行查詢 - mysql是否必須加載所有1,000,000條記錄才能完成計數? – user291701 2011-02-25 19:08:52

+0

@ user291701 - 如果您已經知道用戶的'num_games_won',則不需要子選擇。這不應該降級,因爲它只獲得記錄數(它不會爲所有記錄帶回數據行)。 – rosscj2533 2011-02-25 19:16:58

1

在這種情況下,用戶你可以做一個簡單的ORDER BY。不幸的是,MySQL不支持像其他數據庫支持的RANKROWNUMBER這些很好的分析功能,因爲當答案不如ORDER BY那麼簡單時,這些將是其他可能的解決方案。

(編輯:您可以排序cheat and simulate ROWNUMBER in MySQL感謝這個答案的SO)

在這種情況下,你會做SELECT * FROM users ORDER BY num_games_won DESC和第一行會擁有最,第二個會有第二大等

+0

此解決方案不會處理聯繫。 – 2011-02-25 18:36:49

+0

我認爲應該在事物的應用方面處理某些事情。這個解決方案仍然列出了按降序獲勝的遊戲數量,因此它們在理論上是彼此相鄰的。 – 2011-02-25 20:46:34