Я покажу вам, как это сделать [для интервальных функций обновления sql]
выберите:
set @currentRank = 0,
@lastRating = null,
@rowNumber = 1;
select
*,
@currentRank := if(@lastRating = `score`, @currentRank, @rowNumber) `rank`,
@rowNumber := @rowNumber + if(@lastRating = `score`, 0, 1) `rowNumber`,
@lastRating := `score`
from `table`
order by `score` desc
Обновление:
set @currentRank = 0,
@lastRating = null,
@rowNumber = 1;
update
`table` r
inner join (
select
`primaryID`,
@currentRank := if(@lastRating = `score`, @currentRank, @rowNumber) `rank`,
@rowNumber := @rowNumber + if(@lastRating = `score`, 0, 1) `rowNumber`,
@lastRating := `score`
from `table`
order by `score` desc
) var on
var.`primaryID` = r.`primaryID`
set
r.`rank` = var.`rank`
Я не делал никаких проверок производительности на этом, за исключением тестирования, что он работает