0

=最好的方法是什么?我正在撤回按分数排序的 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"));

必须有一种更好的方法来做到这一点,但我想不出一个。

4

1 回答 1

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 个成员,因此我会使用它。

您拥有的例程的一个问题是分数可以在 DB 读取之间发生变化,因此您的数字无法正确加起来。通过从一个 DB 读取中运行分数,一切都将保持同步。

关于数据库读取的时间,过去运行额外的数据库读取是一个很大的禁忌,但现在,这几乎没有那么重要了。网络服务器会将部分数据库加载到内存中,使数据库读取速度通常与仅 php 的内存操作一样快。如果您正在运行大量数据或获得大量流量并且需要节省资源,则例外情况。

于 2013-09-19T03:03:48.090 回答