环顾网站,大多数与高分表中的排名有关的问题都假设您将看表的整体或顶部。

在此站点上的许多示例中,通过按得分对项目进行排序,然后从集合顶部开始对行进行计数,或者对被检索的项目进行计数来确定排名。像这样

score  name     rank
1000   test345  1
999    test980  2
950    test234  3
833    test291  4
760    test573  5
731    test981  6


在我的情况下,我只需要查看分数的一部分,例如,可能不在排行榜的一半,这可能不在表格的顶部。

scores  name     rank
500     test451  43
433     test768  44
425     test120  45


仅向用户显示其周围的分数。用户在上方查看排行榜的那部分不在排行榜的顶部,因此我无法计算返回分数中的行来确定其排名。

如何有效地确定排行榜中任意位置的用户等级,并在其中有趣地输入大量内容。

这也是我第一次尝试sql和php。我可能没有使用正确的术语。

最佳答案

我不确定您要做什么。您可以使用LIMIT子句来限制结果,如下所示:

SELECT * FROM <table> LIMIT 0, 3


只会返回前3条记录。

要根据rank字段对结果进行排序,可以使用ORDER BY子句:

SELECT * FROM <table> ORDER BY rank DESC LIMIT 0, 3


上面的查询将按降序返回3条记录。

如果您想基于scores列计算排名,则可以这样做:

SELECT scores,
       name,
       FIND_IN_SET(scores, (SELECT GROUP_CONCAT(scores ORDER BY scores DESC)
       FROM <table>)) as rank
FROM <table> ORDER BY rank DESC LIMIT 0, 3;


对只有两列scoresname的表运行上述查询:

+--------+---------+
| scores | name    |
+--------+---------+
|    500 | test451 |
|    433 | test768 |
|    425 | test120 |
|    300 | test001 |
|    250 | test002 |
|    200 | test003 |
+--------+---------+


将产生以下结果:

+--------+---------+------+
| scores | name    | rank |
+--------+---------+------+
|    500 | test451 |    1 |
|    433 | test768 |    2 |
|    425 | test120 |    3 |
+--------+---------+------+


GROUP_CONCAT()最大长度取决于group_concat_max_len系统变量,因此对于较大的表,需要进行更改,并且我不确定这是否是最佳方法。

请注意,您可以/应该在表中添加索引以加快处理速度:

ALTER <table> ADD INDEX `idx_scores` (`scores`);

07-24 09:37
查看更多