MySQL排名系统自定义查询

时间:2017-10-06 19:00:12

标签: mysql ranking

我有排名系统,这是基于积分的结果。

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

假设我的用户ID是197,那么首先我要知道我的排名或点数,最高点,最后最低点,所以这里假设我的排名(user-id = 197)是#150 < / p>

获得我的排名后(如果我的排名不在前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的应用程序,那么实现此结果集的最佳和有效方法是什么?

1 个答案:

答案 0 :(得分:1)

返回得分及其等级的总体查询将是(或者我应该说&#39;可能是&#39;,因为它有效,但可能不是最优雅的解决方案):

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;

然后你必须在php中使用理论$myRank的输出来获得下一组结果。例如,如果您希望排名后的下一个50,则将最后一行更改为:

LIMIT $myRank,$upper;

上面是php,在php:

$upper = $myRank+50;

在您真正确定完整解决方案之前,您显然需要弄清楚您想要在不同情况下实现的目标,但希望这会有所帮助。