MySQL Help: Como otimizar a consulta de atualização que define a classificação de acordo com a ordem de outra coluna

omunidade @Hello StackOverflow:

A situaçã

Estou criando uma consulta de atualização que define classificações para todos os registros em uma tabela, de acordo com a comparação entre cada registro. Exemplo de tabela:

id | budget | cost | rank | rank_score  
 1 |   500  |  20  |   ?  |     ?  
 2 |   400  |  40  |   ?  |     ?  
 3 |   300  |  40  |   ?  |     ?

Então nesta tabela,cost têm mais peso na determinação da classificação, seguido porbudget. Assim, o registro nº 2 terá uma classificação mais alta, enquanto o registro nº 3 será o segundo e o nº 1 será o último. Como você pode ver, se dois registros tiverem o mesmocost, entãobudget quebra o empate.

Agora, para acompanhar esse 'peso' facilmente, estou criando orank_score, que conterá a concatenação decost ebudget. Então, orank_score para a tabela acima seria:

id | budget | cost | rank | rank_score  
 1 |   500  |  20  |   ?  |   20500   
 2 |   400  |  40  |   ?  |   40400  
 3 |   300  |  40  |   ?  |   40300  

Esterank_score pode ser preenchido como:

UPDATE table_name
SET rank_score = CONCAT(cost, budget);
O problem

Tudo bem até agora. Mas agora vem o problema. Eu preciso de um número inteirorank coluna para várias coisas, como classificação, mas acima de tudo para mostrando ao usuário a classificação do seu registro. Claro,istorank será igual à ordem decrescente dos rank_scores. Mas não consigo encontrar uma maneira de calcular issorank coluna em uma única consulta de atualização sem ter que fazer subconsultas, loops no php, et

O que eu tentei

Então, no começo eu estava tentando buscar orank_score cálculo como:

SELECT id,
       CONCAT(cost, budget) AS rank_score
FROM table_name ;

e, em seguida, repetindo no php todos esses rank_scores, apenas para criar uma consulta que foi como:

UPDATE table_name
SET rank_score = CASE id WHEN 1 THEN 20500 END,
    rank = CASE id WHEN 1 THEN 3 END
WHERE id IN (1) ;

... Obviamente, esta consulta de amostra de atualização não está completa, pois possui maisWHEN THEN END cláusulas para cada registro na tabela. Escusado será dizer que isso é feio, especialmente quando você espera ter milhares e milhares de registro

Então, em conclusão, eu já tenho uma maneira de calcularrank_score, mas também quero calcularrank (= ordem decrescente da pontuação no ranking) na mesma consulta, ou pelo menos sem fazer esse loop php louco eCASE WHEN THEN END cláusula

Obrigado por ler e pensar sobre isso;) Esclarecimentos

Esclarecendo o que @ SJuan76 disse: Não consigo atribuir uma classificação via php, pois há casos em que o usuário mostra uma quantidade fixa de registros por vez (por exemplo, sua página de usuário:SELECT * WHERE user_id = 333, que pode buscar 1, 3 ou 8 registros) e ele precisa saber qual é a classificação de cada registro. A atribuição de uma classificação via php nesse caso não funciona porque essa classificação será relativa aos registros buscados, não a todos na tabel

questionAnswers(3)

yourAnswerToTheQuestion