Я пытаюсь получить голову вокруг запроса, и я просто не могу понять это. Я ценил бы, если кто-то дает мне подсказку. Как простой пример того, чего я пытаюсь достигнуть, у меня есть эти записи в базе данных
Score|Ranking
-------------
100 |0
200 |0
300 |0
И я хотел бы, чтобы поле Ranking содержало 1,2,3 на основе того, у кого есть самый высокий счет, таким образом, результат должен быть:
Score|Ranking
-------------
100 |3
200 |2
300 |1
В данный момент я делаю для следующего цикла для всех этих записей, но, учитывая, что в действительности, который мог быть несколькими тысячами - который мог взять навсегда! У кого-либо есть идея о волшебном запросе, который сделал бы это сразу?
В MySQL вы можете использовать row_number.
Вот пример использования его в SELECT
:
select @rownum:=@rownum+1 ‘rank’, p.*
from player p, (SELECT @rownum:=0) r
order by score desc;
Если вы INSERT INTO
используете SELECT
, как это, вы получите рейтинг.
Вот способ сделать это:
SET @r=0;
UPDATE table SET Ranking= @r:= (@r+1) ORDER BY Score DESC;
/* use this if you just want to pull it from the db, but don't update anything */
SET @r=0;
SELECT *, @r:= (@r+1) as Ranking FROM table ORDER BY Score DESC;
Это создает встроенный оператор обновления, который будет ранжировать ваших игроков, увеличиваясь с помощью переменной @rc
. Я использовал его много раз в очень похожих случаях, он работает хорошо и сохраняет все на стороне БД. Предполагается, что
SET @rc = 0;
UPDATE players JOIN (SELECT @rc := @rc + 1 AS rank, id FROM players ORDER BY rank DESC)
AS order USING(id) SET players.rank = order.rank;
id
является первичным ключом для вашей таблицы Players
.