如何最好地从PHP和mysql的分数表中获得某人的“排名”而不进行循环

时间:2012-01-07 04:21:29

标签: php mysql

我的表格将包含分数和首字母。

但桌子不会被订购。

我可以轻松获得总行数,我知道我可以获得所有这些并按顺序排序然后循环遍历它们并获得排名......

但是有更好的方法吗?这可能是用SQL语句完成的吗?

我不太关心性能所以如果SQL语句是一些疯狂的东西,那么我只是循环。

抱歉 - Table的ID为主键,用于验证唯一应用安装的字符串,首字母列和得分列。

当有人点击GET RANK时......我希望能够告诉他们他们的得分是1000分中的100分。

3 个答案:

答案 0 :(得分:9)

SELECT s1.initials, (
  SELECT COUNT(*)
  FROM scores AS s2
  WHERE s2.score > s1.score
)+1 AS rank
FROM scores AS s1

答案 1 :(得分:3)

您是否拥有该表的主键,或者您是通过首字母获取数据还是只是获取所有数据并循环通过它来获取单个记录?你想要获取多少结果?

如果您只想获取一条记录,正如标题所示,您将使用WHERE条件查询数据库:

SELECT score FROM table WHERE user_id = '1';

答案 2 :(得分:1)

请参阅此答案:https://stackoverflow.com/a/8684441/125816

简而言之,您可以这样做:

SELECT id, (@next_rank := IF(@score <> score, 1, 0)) nr, 
           (@score := score) score, (@r := IF(@next_rank = 1, @r + 1, @r)) rank 
FROM rank, (SELECT @r := 0) dummy1
ORDER BY score DESC;

它会产生这样的结果:

+------+----+-------+------+
| id   | nr | score | rank |
+------+----+-------+------+
|    2 |  1 |    23 |    1 |
|    4 |  1 |    17 |    2 |
|    1 |  0 |    17 |    2 |
|    5 |  1 |    10 |    3 |
|    3 |  1 |     2 |    4 |
+------+----+-------+------+

请注意,得分相同的用户具有相同的排名。 : - )