2012-04-17 3 views
0

Недавно я создал систему подсчета очков, в которой пользователи упорядочены по их точкам по принципу снижения. Сначала я использовал для хранения рангов в отдельной колонке. Я использовал, чтобы запустить этот цикл, чтобы обновить ранг: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'; 

Но это всего лишь оператор выбора. В любом случае я могу обойти это и изменить его так, чтобы он обновлял таблицу так же, как это сделал цикл?

ответ

1

Пожалуйста, попробуйте использовать следующий запрос:

set @rownum:=0; 
update sector0_players set [email protected]:[email protected]+1 ORDER BY points DESC; 

PHP код может быть,

mysql_query("set @rownum:=0;"); 
mysql_query("update sector0_players set [email protected]:[email protected]+1 ORDER BY points DESC;"); 
+0

set @rownum: = 0; # MySQL возвратил пустой набор результатов (то есть нулевые строки). update Sector0_players set scoreboard_rank = @ rownum: = @ rownum + 1 ORDER BY points DESC; # MySQL возвращает пустой набор результатов (то есть нулевые строки). <--- Это ошибка, которую я продолжаю получать ... –

+0

Если вы повторите запрос снова и снова, он покажет это сообщение. Попробуйте обновить ранг табло до нуля, а затем запустите запрос один раз. – Prabhuram

+0

Это работает отлично! Не могли бы вы объяснить, почему ряды изменились из-за этого запроса. Мне нужно изменить его в будущем. :) * EDIT * есть способ выполнить это право с PHP? –

0

Вы можете попробовать использовать функцию RANK .. Я на самом деле не выполнивший SQL, но должен работать

UPDATE sector0_players 
SET scoreboard_rank = 
(
SELECT srank 
FROM 
(
    SELECT id,points, RANK() OVER (ORDER BY points) AS srank 
    FROM sector0_players T 
) D 
WHERE D.id = sector0_players.id 
AND D.points = sector0_players.points 
)