В основном, что вы здесь делаете, подсчитываете, сколько пользователей имеет atacs
больше или равно 's atacs
. Проблемы с этим:
- Ужасно неэффективно. Обратите внимание, что база данных извлекает и отправляет на ваш , пока цикл записи для каждого пользователя, даже те, у кого есть
atacs
меньше, чем $userid
. Все, кроме одного из них, итерации цикла ничего не делают по дизайну. Много потерянного времени, отправляющего данные из базы данных на 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
текущего пользователя. Все пользователи с одинаковой оценкой получат одинаковый ранг, а следующий ранг будет соответственно выше, поэтому он не страдает от ошибок вашего метода.
В качестве окончательного примечания, наиболее подходящий способ сделать что-то вроде лидеров - это, вероятно, периодически прекомпопировать таблицу лидеров, а затем использовать результаты, чтобы показать позицию каждого пользователя в списках лидеров, а не пытаться вычислить ее на лету для каждого пользователь.Но это еще дальше из-за границы :)
'$ i' никогда не меняется. вы, вероятно, захотите пощекотать «$ i = $ i + 1» там где-то ... –
Пожалуйста, [не используйте 'mysql_ *' функции] (http://stackoverflow.com/questions/12859942/why- shouldnt-i-use-mysql-functions-in-php) в новом коде. Они больше не поддерживаются и [официально устарели] (https://wiki.php.net/rfc/mysql_deprecation). Узнайте о [подготовленных заявлениях] (http://en.wikipedia.org/wiki/Prepared_statement) и используйте [PDO] (http://us1.php.net/pdo) или [MySQLi] (http: // us1.php.net/mysqli). –