2017-10-06 90 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; 

你会显然需要根据不同情况弄清楚你想要达到的目标,然后才能确定一个完整的解决方案,但希望这对你有所帮助。