Mysql
 sql >> Datenbank >  >> RDS >> Mysql

MySQL-Hilfe:Optimieren Sie die Aktualisierungsabfrage, die den Rang gemäß der Reihenfolge einer anderen Spalte festlegt

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üssen
SELECT * 
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.