Я пытаюсь сохранить ранг пользователей на основе оценки, все это одна таблица, и пропускаю ранги, когда есть ничья. Например:
ID Score Rank
2 23 1
4 17 2
1 17 2
5 10 4
3 2 5
Каждый раз, когда обновляется оценка пользователя, также должен обновляться рейтинг для всей таблицы, поэтому после обновления оценки выполняется следующий запрос:
SET @rank=0;
UPDATE users SET rank= @rank:= (@rank+1) ORDER BY score DESC;
Но это не поддерживает ничью или пропуск номеров рангов после ничьи, если уж на то пошло.
Я хочу добиться этого повторного ранжирования с помощью как можно меньшего количества запросов и без объединений (поскольку они кажутся довольно трудоемкими).
Я смог получить желаемый результат, добавив два столбца — last_score и tie_build_up — со следующим кодом:
SET @rank=0, @last_score = null, @tie_build_up = 0;
UPDATE users SET
rank= @rank:= if(@last_score = score, @rank, @rank+@tie_build_up+1),
tie_build_up= @tie_build_up:= if(@last_score = score, @tie_build_up+1, 0),
last_score= @last_score:= score, ORDER BY score DESC;
Мне не нужны эти дополнительные столбцы, но я не мог заставить работать один запрос без них.
Любые идеи?
Спасибо.