2012-10-30 170 views
2

可能重複:
MySQL get row position in ORDER BY
Calculating rank in PHP/MySQL如何獲取行位置?

我有一個遊戲系統在PHP中寫道,每個用戶擁有的錢X量。 我有一個頁面顯示網站中最豐富的用戶。

$ranking = mysql_query(" 
    SELECT * 
    FROM users 
    ORDER BY money DESC 
    LIMIT 10 
"); 

現在我想給每個用戶在列表中的位置。 我無法選擇所有信息並開始排序以獲得一個值,這是浪費資源。 如何選擇一行的位置(userid = X)?

(MYSQL)

+1

如果兩行是並列的呢? – RedFilter

+0

@紅色過濾器,對不起,我不明白你的意思 – Alvarez

回答

0

Rank列將在列表中的位置:

SELECT t.*, 
    @rownum := @rownum + 1 AS rank 
FROM users, (SELECT @rownum := 0) r 
ORDER BY money DESC 
LIMIT 10 
+0

我試過編輯並添加我需要的WHERE子句,無論如何,它總是給我1而不是正確的位置。 – Alvarez

0

你不能沒有做全表排序做到這一點很容易/快。我建議你只定期給每個人一個新的等級,或許是每個小時,並以這種方式更新他們的位置。

對於「排行榜」,您不會遇到此問題,因爲您始終會有偏移和限制限制。所以,當你顯示排名前10位(有限),你知道他們的行列1 - 10

然而,就選擇單個用戶,你不能沒有一個高度 inneficient表排序做到這一點。

而且,看到這個其他問題,這

Calculating rank in PHP/MySQL

+0

我不介意做一個完整的表格排序,但我想在資源中得到結果,而不是在PHP中排序。 – Alvarez

1

下面是一個簡單和標準的方式來做到這一點使用相關子查詢(我認爲這是一個近乎完全相同的副本?):

SELECT *, (SELECT count(*) + 1 FROM users WHERE money > u.money) as MoneyRank 
FROM users AS u 
WHERE username = 'X' 

這是SqlFiddle demo

然而,這確實遭受性能問題,因爲任何"triangular join"(SQL Server文章,但仍然適用)會。我仍然會自己以這種方式最初實現它(這很簡單),然後索引如果存在性能問題,然後轉向其他預先計算的/緩存的選項(如果不夠好)。評論還提到了其他可行的解決方案。