=这样做的最佳方式是什么?我正在撤回100个按分数排序的记录,以获得高分榜。我还需要撤回用户排名并指向下一个位置。
我目前正在这样做,但我不确定这是最好的方式
mysql_query("SELECT * FROM highScores ORDER BY score DESC");
我正在循环搜索这些结果以显示最高分。然后获得用户排名和下一个点我正在做以下
$rank = mysql_num_rows(mysql_query("SELECT id, score FROM highScores WHERE score>='$userScore'"));
这让我获得了排名,然后我对用户上方的下一个位置进行了另一次查询并获取该分数
$next_rank_score = mysql_fetch_assoc(mysql_query("SELECT score FROM highScores ORDER BY score DESC LIMIT " . ($rank-2) . ",1"));
必须有一个更好的方法来做到这一点,但我想不出一个。
答案 0 :(得分:0)
如果您正在做的事情,您不一定要改变它。很高兴获得想法,你问的很好。
这是一种只需要对数据库进行一次点击的方法。此外,限制返回的记录数量会增加购买速度,特别是如果你有很多分数可以从中获得前10名。
<?php
$query = 'SELECT * FROM highScores ORDER BY score DESC limit 0, 101';
$highScores = mysql_query($query);
$ranks = array();
$scores = array();
$score_to_nexts = array();
$i=1;
while ($highScore = mysql_fetch_array($highScores) and $i<102):
$ranks[$i] = $i;
$scores[$i] = $highScore['score'];
if ($i !== 1):
$score_to_nexts[$i-1] = strval($scores[$i-1] - $scores[$i])
endif;
$i++;
endwhile;
$i=1;
while ($i<11):
$rank = $ranks[$i];
$scores = $scores[$i];
$score_to_next = $score_to_nexts[$i];
$i++;
endwhile;
?>
php以惊人的速度撕裂数组,所以这肯定会接近尽可能快的速度。压缩周期可能有一些逻辑,但由于你的阵列只需要处理11个成员,我就会用它来运行。
您所使用的例程存在的问题是,数据库读取之间的分数可能会发生变化,因此您的数字无法正确累加。通过从一个数据库读取运行分数,一切都将是同步的。
关于数据库读取的时间,以前运行额外的数据库读取是一个很大的禁忌,但现在,这几乎无关紧要。 Web服务器将部分DB加载到内存中,使得DB读取的速度通常与仅在内存中的操作一样快。例外情况是,如果您运行大量数据或获得大量流量并需要节省资源。