SQL用户评分,从任意位置得分

时间:2015-02-10 07:12:06

标签: 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。我可能没有使用正确的术语。

1 个答案:

答案 0 :(得分:0)

我不确定你要做什么。您可以使用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`);