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
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
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