Zuerst würde ich budget
ändern , cost
und rank_score
in Integer oder andere numerische Datentypen und anstelle von
UPDATE table_name
SET rank_score = CONCAT(cost, budget) ;
Dann würden Sie verwenden:
UPDATE table_name
SET rank_score = cost * 1000 + budget * 1 ;
Es ist dann einfacher, da Sie sich nicht mit Zeichenfolgenfunktionen befassen müssen und etwas wie:
haben müssenSELECT *
FROM table_name
WHERE (conditions...)
ORDER BY rank_score DESC
(Klammern:mit einem Parameter (1000
) so höher eingestellt als die anderen (1
) entspricht einer Reihenfolge von cost, budget
. Versuchen Sie Folgendes, um Folgendes zu überprüfen:
SELECT *
FROM table_name
ORDER BY cost DESC
, budget DESC
Sie können den rank_score
also gut fallen lassen alles zusammen, es sei denn natürlich, Sie planen Experimente mit verschiedenen Parameterwerten.
Wie andere angemerkt haben, ist es nicht die beste Methode, ein Feld zu haben, das keine Daten, sondern eine Berechnung speichert. Es ist Denormalisierung. Stattdessen halten Sie die Tabelle normalisiert und lassen die Datenbank die Berechnungen durchführen, wann immer Sie sie brauchen:
SELECT id, budget, cost,
cost*1000 + budget*1 AS rank_score_calculated
FROM table_name
ORDER BY rank_score_calculated DESC
rank_score_calculated
wird im obigen Beispiel nicht gespeichert. Auf diese Weise müssen Sie das berechnete Feld nicht jedes Mal aktualisieren, wenn ein Budget oder Kosten geändert oder eine neue Zeile in der Tabelle hinzugefügt wird.
Es gibt nur einen Nachteil. Wenn die Tabelle wirklich groß ist und diese Abfrage (und die Berechnung) von vielen Benutzern und sehr oft durchgeführt werden muss und die Tabelle ziemlich oft aktualisiert wird, kann dies Ihre Datenbank verlangsamen. In diesem Fall sollte man darüber nachdenken, ein solches Feld hinzuzufügen.
Der andere Fall ist, wenn man einen absoluten rank
benötigt über alle Tabellenzeilen, wie Ihr Bedarf. Da MySQL keine "Fenster"-Funktionen hat, ist es sehr schwierig, eine solche Abfrage in reinem SQL zu schreiben.)
Der Rang kann mithilfe von MySQL-Variablen berechnet werden
SELECT *
, @rownum:[email protected]+1 AS rank_calculated
FROM table_name
, (SELECT @rownum:=0) AS st
ORDER BY rank_score DESC
Und wenn Sie diese Werte in rank
setzen möchten , verwenden Sie:
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 ;
Die beiden obigen Abfragen sind kein reines SQL. Sie können die Option prüfen, zu einem anderen Datenbanksystem zu wechseln, das Fensterfunktionen unterstützt, wie Postgres, SQL-Server oder Oracle.