2017-10-06 89 views
0

我有排名系統,這是基於積分的結果。MySQL排名系統自定義查詢

User | Points 
    1 | 100 
    2 | 197 
    3 | 123 
    4 | 174 
    5 | 98 
    ... 
    197 | 21 
    198 | 110 
    199 | 154 

假設我的用戶ID是197,所以首先我希望我的排名依據或點,最高點,首先,在去年最低的,所以這裏假設要知道,我的等級(用戶ID = 197)是否#150

獲得我的排名後(如果我的排名不在前100名單),那麼我想要得到100名用戶的列表,我需要得到第1至第50名用戶+第125名至第175名用戶我也可以在此列表中獲得我的排名,但對於列表排名將在結果中的實際排名

User | Points | Rank 
18 | 199 | 1 
22 | 198 | 2 
31 | 180 | 3 
19 | 174 | 4 
51 | 168 | 5 
+ 
17 | 22 | 149 
197 | 21 | 150 
199 | 14 | 151 

我有應用程序在PHP中,那麼實現這個結果集的最好和有效的方法是什麼?

+5

我們總是樂於幫助和支持新的編碼器,但是您需要首先幫助自己。 : - )***在[**做更多研究**之後](https://meta.stackoverflow.com/q/261592/1011527)如果你有問題**發佈你已經嘗試** **清楚說明什麼不工作**並提供[最小,完整和可驗證示例](http://stackoverflow.com/help/mcve)。閱讀[如何問](http://stackoverflow.com/help/how-to-ask)一個很好的問題。請務必[參觀](http://stackoverflow.com/tour)並閱讀[this](https://meta.stackoverflow.com/q/347937/1011527)。 –

回答

1

返回的得分與他們的排名將是(或者我應該說「可能」,因爲它的工作原理,但可能不是最優雅的解決方案)的總體查詢:

SET @count = 0; 
SELECT 
    user, 
    points, 
    rank 
    FROM( 
     SELECT user, 
       points, 
        @count := @count + 1 'rank' 
     FROM scores 
     ORDER BY points DESC 
    ) as ranks; 

所以,如果你想知道一個特定用戶的排名,你會在末尾添加的where條款,:

WHERE user = 197; 

當涉及到第二部分,尤其是與格式,我認爲這是最好的PHP完成。你可以運行上面獲取你的「排名」,然後做這樣的事情(注:我只是僞這裏引用PHP,而不是腳本的答案):

$myRank = [result of above query]; 

if($myRank > 100) { 

// retrieve first 50 results and display in query 1 

echo "..."; // or in a <td>, etc. 

// retrieve results x to y and display in query2, loop through a table etc. 

} 
else { 

// retrieve the first 100 if your score is in that range 

} 

的前50個結果的SQL將

SET @count = 0; 
SELECT 
    user, 
    points, 
    rank 
    FROM( 
     SELECT user, 
       points, 
        @count := @count + 1 'rank' 
     FROM scores 
     ORDER BY points DESC 
    ) as ranks 
    LIMIT 0,50; 

,然後你就必須使用我們的理論$myRank的輸出在PHP獲得下一組結果。例如,如果你的排名後希望在未來的50,你會改變最後一行:

LIMIT $myRank,$upper; 

其中大寫是,在PHP中:

$upper = $myRank+50; 

你會顯然需要根據不同情況弄清楚你想要達到的目標,然後才能確定一個完整的解決方案,但希望這對你有所幫助。