php - 用户得分的 SQL 排名,从任意位置

标签 php mysql sql rank

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

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

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`);

关于php - 用户得分的 SQL 排名,从任意位置,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28426001/

相关文章:

php - PHP str_ functions的发音?

php - 发送不会成为垃圾邮件的自动邮件

php - 无法从 mysql 检索最后一行

sql - 使用 T-SQL 创建表 - 在对象资源管理器中看不到创建的表

php - 我们如何在 zend 框架上创建翻译验证错误消息?

php - 中文字符问题,PHP Web 服务

mysql - 将 mysql 数据库表从一个数据库复制到另一个数据库

mysql - 将表id合并并替换为两个表SQL的字符串

mysql - SQL 中的 MAX() 函数

Mysql模拟FULL OUTER JOIN