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

Bindestrich in MySQL-Order-by-Klausel

Die Antwort liegt in der Frage:

Das Schlüsselwort hier ist "Ausdruck" . Sie können Ausdrücke in ORDER BY verwenden Klausel.

ORDER BY -order_line_groups.sequence DESC

ist ein arithmetischer Ausdruck und der "Bindestrich" ist kein Bindestrich, sondern ein Minus; ein unärer minus mathematischer Operator.

Wie es funktioniert?

Hinsichtlich des Ergebnisses funktioniert es wie erwartet:

  • Wenn der Spaltentyp order_line_groups.sequence ist ein numerischer Typ oder ein Datums- und Zeittyp (sie werden intern auch als Zahlen gespeichert), dann kehrt das Minus die Reihenfolge der zurückgegebenen Zeilen um. Die Klausel ist äquivalent zu

      ORDER BY order_line_groups.sequence ASC
    
  • Wenn der Typ der Spalte ein String-Typ dann versucht MySQL, die Werte umzuwandeln der Spalte zu Zahlen (weil die Subtraktion eine arithmetische Operation ist und nicht für Zeichenketten definiert ist). Wenn MySQL Strings in Zahlen umwandelt, stoppt es beim ersten Zeichen, das keine Ziffer ist. Abhängig von den Daten, die Sie in der Spalte order_line_groups.sequence hinterlegen , werden mehr oder weniger seiner Zeichenfolgenwerte in die Zahl 0 umgewandelt .

In Bezug auf die Geschwindigkeit, wie auf der Dokumentationsseite in der Frage erläutert, kann MySQL keine Indizes verwenden, um den ORDER BY aufzulösen . Dadurch wird die Abfrage langsam.

Schlussfolgerung

Verwenden von ORDER BY -order_line_groups.sequence macht die Abfrage langsam. Darüber hinaus bietet es keine gute Möglichkeit, die Ergebnismenge zu sortieren, wenn der Spaltentyp sequence ist ist ein String-Typ.