首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Mysql提取结果和当前等级

Mysql提取结果和当前等级
EN

Stack Overflow用户
提问于 2013-09-19 02:18:51
回答 1查看 141关注 0票数 0

=做这件事最好的方法是什么?我要收回按分数排序的100项纪录,以获得高分。我还需要收回用户的排名,并指向下一个位置。

我现在是这样做的,但我不确定这是最好的方法

代码语言:javascript
复制
mysql_query("SELECT * FROM highScores ORDER BY score DESC");

我正在循环这些结果,以显示最高的分数。然后,为了获得用户的排名和下一个点,我将执行以下操作

代码语言:javascript
复制
$rank = mysql_num_rows(mysql_query("SELECT id, score FROM highScores WHERE score>='$userScore'"));

这使我获得了排名,然后我对用户之上的下一个位置执行另一个查询,并获取该分数。

代码语言:javascript
复制
$next_rank_score = mysql_fetch_assoc(mysql_query("SELECT score FROM highScores ORDER BY score DESC LIMIT " . ($rank-2) . ",1"));

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

EN

回答 1

Stack Overflow用户

发布于 2013-09-19 03:03:48

如果你正在做的工作,你不一定要改变它。很高兴得到点子,很好,你问的。

这是一种只需要对数据库进行一次访问的方法。此外,限制返回的记录数量将购买速度,特别是如果你有很多分数从前10名。

代码语言:javascript
复制
    <?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操作的速度一样快。例外情况是,如果您正在运行大量数据或获得大量通信量,并且需要节省资源。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/18885267

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档