Оператор обновления MySQL для хранения занимающих место положений

Я пытаюсь получить голову вокруг запроса, и я просто не могу понять это. Я ценил бы, если кто-то дает мне подсказку. Как простой пример того, чего я пытаюсь достигнуть, у меня есть эти записи в базе данных

Score|Ranking
-------------
100  |0
200  |0
300  |0

И я хотел бы, чтобы поле Ranking содержало 1,2,3 на основе того, у кого есть самый высокий счет, таким образом, результат должен быть:

Score|Ranking
-------------
100  |3
200  |2
300  |1

В данный момент я делаю для следующего цикла для всех этих записей, но, учитывая, что в действительности, который мог быть несколькими тысячами - который мог взять навсегда! У кого-либо есть идея о волшебном запросе, который сделал бы это сразу?

11
задан Juan Mellado 3 May 2012 в 15:29
поделиться

3 ответа

В MySQL вы можете использовать row_number.

Вот пример использования его в SELECT:

select @rownum:=@rownum+1 ‘rank’, p.* 
from player p, (SELECT @rownum:=0) r 
order by score desc;

Если вы INSERT INTO используете SELECT, как это, вы получите рейтинг.

6
ответ дан 3 December 2019 в 02:40
поделиться

Вот способ сделать это:

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;
18
ответ дан 3 December 2019 в 02:40
поделиться

Это создает встроенный оператор обновления, который будет ранжировать ваших игроков, увеличиваясь с помощью переменной @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 .

5
ответ дан 3 December 2019 в 02:40
поделиться
Другие вопросы по тегам:

Похожие вопросы: