我在MySQL中创建了一个带有高分表的游戏。
我有一个“我的分数”按钮,需要检索用户分数,例如:
10. John 395
42. John 340
90. John 10
我应该如何检索用户每个分数的排名(第10,42,90)? 我可以从数据库中提取所有分数并迭代它们,但这似乎不是一个好的解决方案。
让我试着扩大: 我从数据库中检索所有MY分数。例如。 10分。我想显示这10个分数但是我不知道这些分数的等级与我的数据库中的其他分数相比较! (10日,16日等)。希望更有意义......
由于
答案 0 :(得分:1)
一个简单的SQL查询可以帮到你。例如,如果您想获得第10个分数,则可以使用:
SELECT name, score FROM highscores ORDER BY score DESC LIMIT 1 OFFSET 9
偏移量始终是所需的位置 - 1.
如果您希望将相关排名作为分数旁边的列,则可以执行以下操作:
SELECT @rownum:=@rownum+1 position, name, score FROM (SELECT @rownum:=0) r, highscores ORDER BY score DESC
这不适用于偏移(位置编号始终从1开始)。结果将类似于以下内容:
+----------+-------------+-------+
| position | name | score |
+----------+-------------+-------+
| 1 | Player 1 | 27681 |
| 2 | Player 2 | 14982 |
+----------+-------------+-------+
但我认为最好的解决方案是使用索引循环返回的值并使用索引来跟踪位置。
答案 1 :(得分:1)
对于总列表中的位置,您需要在每次需要此概述时构建列表,或者使用存储过程为给定时刻构建列表。您可以在给定的时间间隔内“缓存”列表。或者,如果有人玩过可以改变前100名的游戏,也可以更新列表。
正如@WhiteElephant建议的那样,每次你想要数据时都要制作表格。 @stefandoorn建议不要使用优化的sql计数,我认为这对于这类计算来说效率不高。
答案 2 :(得分:1)
SELECT
id, name, score,(select count(*) FROM highscores AS higherscores WHERE higherscores.score>currentscores.score)+1 AS rank
FROM
highscores AS currentscores
WHERE name="john"
;
答案 3 :(得分:-1)
在查询结尾处使用ORDER BY
得分DESC
,可以按相反顺序(从高到低)对它们进行排序。在PHP中迭代并显示它时,您可以使用计数:
查询例如:SELECT * FROM scores ORDER BY score DESC
$count = 1;
$sql = 'SELECT * FROM scores ORDER BY score DESC';
$result = mysql_query($sql) or die(mysql_error());
while($fetch = mysql_fetch_object($result)) {
echo $count . ' ' . $fetch->score . '<br />';
$count++;
}