Първо, бих променил budget
, cost
и rank_score
в цяло число или друг цифров тип данни и вместо
UPDATE table_name
SET rank_score = CONCAT(cost, budget) ;
Тогава ще използвате:
UPDATE table_name
SET rank_score = cost * 1000 + budget * 1 ;
Тогава е по-лесно, тъй като няма да се налага да се занимавате с низови функции и да имате нещо като:
SELECT *
FROM table_name
WHERE (conditions...)
ORDER BY rank_score DESC
(Скоби:с един параметър (1000
) зададен толкова по-високо от другото (1
) е еквивалентно на наличието на ред от cost, budget
. Опитайте това, за да проверите:
SELECT *
FROM table_name
ORDER BY cost DESC
, budget DESC
Така че можете да премахнете rank_score
всичко заедно, освен ако разбира се не планирате да правите експерименти с различни стойности на параметри.
Както посочиха други, не е най-добра практика да имате поле, което съхранява не данни, а изчисление. Това е денормализация. Вместо това поддържате таблицата нормализирана и оставяте базата данни да прави изчисленията всеки път, когато имате нужда от нея:
SELECT id, budget, cost,
cost*1000 + budget*1 AS rank_score_calculated
FROM table_name
ORDER BY rank_score_calculated DESC
rank_score_calculated
не се съхранява в горния пример. По този начин няма да се налага да актуализирате изчисленото поле всеки път, когато се промени бюджет или цена или се добави нов ред в таблицата.
Има само един недостатък. Ако таблицата е наистина голяма и имате нужда от тази заявка (и изчислението), извършена от много потребители и много често, и таблицата се актуализира доста често, тогава това може да забави вашата база данни. В такъв случай трябва да започнете да мислите за добавяне на такова поле.
Другият случай е, когато се нуждаете от абсолютен rank
във всички редове на таблицата, според вашите нужди. Тъй като MySQL няма функции за "прозорци", е много трудно да се напише такава заявка в чист SQL.)
Рангът може да се изчисли с помощта на MySQL променливи
SELECT *
, @rownum:[email protected]+1 AS rank_calculated
FROM table_name
, (SELECT @rownum:=0) AS st
ORDER BY rank_score DESC
И ако искате да поставите тези стойности в rank
, използвайте:
UPDATE table_name
JOIN
( SELECT id
, @rownum:[email protected]+1 AS rank_calculated
FROM table_name
, (SELECT @rownum:=0) AS st
ORDER BY rank_score DESC
) AS r
ON r.id = table_name.id
SET table_name.rank = r.rank_calculated ;
Горните две заявки не са чист SQL. Можете да разгледате опцията за преминаване към друга система за база данни, която поддържа прозоречни функции, като Postgres, SQL-Server или Oracle.