2017-05-25 125 views
1
MySQL用戶排名

我有以下MySQL的聲明帶回排名前10位的用戶數據加上數據的登錄用戶(如果登錄用戶是在排名前10位以後還有隻有10個結果總計,否則有11)...與排序結果

(SELECT user_id, points, amountLikes, amountComments 
FROM all_scores_table 
ORDER BY points desc, amountLikes desc, amountComments desc 
LIMIT 0,10) 

UNION 

(SELECT user_id, points, amountLikes, amountComments 
FROM all_scores_table 
WHERE user_id = $session_user_id) 

ORDER BY points desc, amountLikes desc, amountComments desc 

all_scores_table每個用戶只有1行。我現在試圖將排名信息添加到第二個查詢中(例如,如果有11行,我想知道session_user_id是列表中的第11位還是第468位)。

我讀了一堆類似的帖子,但無法找到,似乎適用於我已經unioning分類結果書面我的初始查詢的方式回答 - 例如我不能只添加點數大於我的用戶的簡單行數,因爲如果他們甚至想引用amountLikes和amountComments來查找真實的順序。

我當然可以做到這一點在PHP與第二查詢,但我希望有人注意到一個優雅的方式,僅

回答

1

MySQL來實現這一目標,我會建議巧言令色和使用一個查詢。相反,只需做兩個查詢,一個查找前十名,另一個查找登錄用戶以及他的數字等級。對於第一個查詢,你可以使用你已經擁有:

SELECT 
    user_id, points, amountLikes, amountComments 
FROM all_scores_table 
ORDER BY points DESC, amountLikes DESC, amountComments DESC 
LIMIT 10 

至於分配行列,你可以很容易地在你的PHP代碼,當您遍歷結果集處理這個問題。只需使用一個變量計數器從1開始

爲了獲得在當前登錄用戶的級別,這將需要更多的工作,因爲他可能被埋藏在記錄數百個(或以上)的中間。一種選擇是使用會話變量:

SET @row_number = 0; 

SELECT 
    (@row_number:[email protected]_number + 1) AS rank, 
    user_id, points, amountLikes, amountComments 
FROM all_scores_table 
WHERE user_id = $session_user_id 
ORDER BY points DESC, amountLikes DESC, amountComments DESC 

這第二個查詢應返回一個記錄(假設每個用戶只出現一次),包含你用數值秩沿需要的元數據。

在你的PHP邏輯,你可以檢查排名進入前十位,並且,如果是這樣,不是在你的表的底部顯示此額外的單記錄。

+0

感謝蒂姆,但我不明白這是如何返回等級信息 - 有沒有其他列,所以我怎麼會知道,如果用戶是第11或第468? – d3wannabe

+0

@ d3wannabe我更新了我的答案。我建議堅持使用您的第一個十大查詢,在您的PHP代碼中分配排名,然後使用會話變量獲取當前登錄用戶的排名。 –