=做这件事最好的方法是什么?我要收回按分数排序的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"));必须有更好的方法来做这件事,但我想不出一个。
发布于 2013-09-19 03:03:48
如果你正在做的工作,你不一定要改变它。很高兴得到点子,很好,你问的。
这是一种只需要对数据库进行一次访问的方法。此外,限制返回的记录数量将购买速度,特别是如果你有很多分数从前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读取的分数,一切都将保持同步。
关于DB读取的时间,过去运行额外的DB读取是一个很大的不-不,但是现在,这几乎没有那么重要。php服务器将将部分DB加载到内存中,使DB读取速度与仅在内存中进行php操作的速度一样快。例外情况是,如果您正在运行大量数据或获得大量通信量,并且需要节省资源。
https://stackoverflow.com/questions/18885267
复制相似问题