Mysql获取结果和当前排名

时间:2013-09-19 02:18:52

标签: php mysql

  

=这样做的最佳方式是什么?我正在撤回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"));

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

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读取的速度通常与仅在内存中的操作一样快。例外情况是,如果您运行大量数据或获得大量流量并需要节省资源。