我尝试这样的事情:

function userrank($userid){
    $sql = mysql_query("SELECT * FROM users ORDER BY atacs DESC");
    $i   = 1;
    while ($row = mysql_fetch_assoc($sql)) {
        if ($row['username'] == $userid) {
            echo 'You are on ' . $i . ' in the general leaderbord';
        }
    }
}


在排行榜上,它可以正确显示我的排名,但是我也想在另一页上的“ youraccount”页面上显示我,为此,我尝试实现此功能。
怎么了 ?

最佳答案

基本上,您在这里所做的是计算有多少用户的atacs大于或等于$useridatacs。问题:


效率极低。注意数据库检索并发送到您的
while为每个用户循环一个条目,即使那些拥有atacs的用户
小于$userid。除了while循环迭代之外的所有迭代
设计不会执行任何操作。从服务器发送数据浪费了很多时间
数据库转换为PHP,甚至不使用它。
向后拉更多数据
超出了必要。您最终将为每个用户中的每一行
您整个users表-但是您的结果只是一个标量数
(多少个用户具有>得分)。
其实给你错误的结果
如果您的分数与他人并列。在这种情况下
得分相同的用户可以算作“高于”用户,其他
作为“用户下方”。


数据库擅长遍历数据。它的
   所有“本地”访问,数据库引擎可以使许多
   如果可以在SQL中描述您要尝试的内容,则可以优化
   完成。因此,为什么不这样做,而不是那样做
   数据库中的所有内容?

set @user_atacs = ( select atacs from users where id = 12 );
select count(*) +1 from users where atacs > @user_atacs;


我在这里模拟了表格:http://sqlfiddle.com/#!2/ff9a86/3

实际上,此解决方案只计算atacs比当前用户高的用户数。具有相同分数的所有用户都将获得相同的排名,而下一个排名将相应地更高,因此它不会受到任何方法错误的影响。

最后一点,做排行榜之类的最合适的方法可能是定期预先计算排行榜,然后使用结果显示每个用户在排行榜中的位置,而不是试图为每个用户动态地计算排行榜。但这甚至超出了范围:)

关于php - 回显i的变量,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/27747659/

10-12 06:44