环顾网站,大多数有关高分表排名的问题都假设您将查看整个表或表的顶部。
在此站点上的许多示例中,排名是通过按分数对项目进行排序,然后从集合顶部开始计算行数,或在检索项目时对项目进行计数来找到的。像这样
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;
对只有两列 scores
和 name
的表运行上述查询:
+--------+---------+
| 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`);
关于php - 用户得分的 SQL 排名,从任意位置,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28426001/