我有排名系统,这是基于积分的结果。
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的应用程序,那么实现此结果集的最佳和有效方法是什么?
答案 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;
在您真正确定完整解决方案之前,您显然需要弄清楚您想要在不同情况下实现的目标,但希望这会有所帮助。