Mysql 获取资源和当前排名


Mysql fetch ressults and current rank

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

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

如果你正在做的事情有效,你不一定需要改变它。 不过很高兴得到想法,很高兴你问。

这是一种只需要对数据库进行一次点击的方法。 此外,限制返回的记录数量将购买速度,特别是如果您有很多分数可以从中选择前 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 服务器会将部分数据库加载到内存中,使数据库读取通常与仅 php 内存中操作一样快。 例外情况是,如果您正在运行大量数据或获得大量流量并且需要节省资源。