Недавно я создал систему подсчета очков, в которой пользователи упорядочены по их точкам по принципу снижения. Сначала я использовал для хранения рангов в отдельной колонке. Я использовал, чтобы запустить этот цикл, чтобы обновить ранг:SQL query construction
$i = 1;
$numberOfRows = mysql_query('SELECT COUNT(`id`) FROM sector0_players');
$scoreboardquery = mysql_query("SELECT * FROM sector0_players ORDER BY points DESC");
while(($row = mysql_fetch_assoc($scoreboardquery)) || $i<=$numberOfRows){
$scoreid = $row['id'];
$mysql_qeury = mysql_query("UPDATE sector0_players SET scoreboard_rank = '$i' WHERE id = '$scoreid'");
$i++;
}
И это было действительно трудно, не говоря уже медленно на самом деле запустить это на огромное количество пользователей. Вместо этого я попытался построить запрос и оказался в этом.
SET @rownum := 0;
SELECT scoreboard_rank, id, points
FROM (
SELECT @rownum := @rownum + 1 AS scoreboard_rank, id, points FROM sector0_players ORDER BY points DESC
)
as result WHERE id = '1';
Но это всего лишь оператор выбора. В любом случае я могу обойти это и изменить его так, чтобы он обновлял таблицу так же, как это сделал цикл?
set @rownum: = 0; # MySQL возвратил пустой набор результатов (то есть нулевые строки). update Sector0_players set scoreboard_rank = @ rownum: = @ rownum + 1 ORDER BY points DESC; # MySQL возвращает пустой набор результатов (то есть нулевые строки). <--- Это ошибка, которую я продолжаю получать ... –
Если вы повторите запрос снова и снова, он покажет это сообщение. Попробуйте обновить ранг табло до нуля, а затем запустите запрос один раз. – Prabhuram
Это работает отлично! Не могли бы вы объяснить, почему ряды изменились из-за этого запроса. Мне нужно изменить его в будущем. :) * EDIT * есть способ выполнить это право с PHP? –