gpt4 book ai didi

MySQL排名系统自定义查询

转载 作者:行者123 更新时间:2023-11-29 10:34:54 25 4
gpt4 key购买 nike

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

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

假设我的用户id是197,所以首先我想知道我的排名或积分,首先是最高分,最后是最低分,所以这里假设我的排名(user-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 应用程序,那么实现此结果集的最佳且有效的方法是什么?

最佳答案

返回分数及其排名的总体查询是(或者我应该说“可能是”,因为它有效,但可能不是最优雅的解决方案):

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 中,upper 是:

$upper = $myRank+50;

在真正确定完整的解决方案之前,您显然需要准确地弄清楚您想要在不同的场景中实现什么,但希望这会有所帮助。

关于MySQL排名系统自定义查询,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46612296/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com