我尝试这样的事情:
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
大于或等于$userid
的atacs
。问题:
效率极低。注意数据库检索并发送到您的
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/