Odpowiedź jest w pytaniu:
Tutaj słowem kluczowym jest "wyrażenie" . Możesz używać wyrażeń w ORDER BY
klauzula.
ORDER BY -order_line_groups.sequence DESC
jest wyrażeniem arytmetycznym, a „łącznik” nie jest łącznikiem, ale minusem; jednoargumentowy minus operator matematyczny.
Jak to działa?
Jeśli chodzi o wynik, działa zgodnie z oczekiwaniami:
-
Jeśli typ kolumny
order_line_groups.sequence
to typ liczbowy lub typ daty i godziny (są one również wewnętrznie przechowywane jako liczby), a następnie minus odwraca kolejność zwracanych wierszy. Klauzula jest równoważna zORDER BY order_line_groups.sequence ASC
-
Jeśli typ kolumny to typ ciągu następnie MySQL próbuje konwertować wartości kolumny na liczby (ponieważ odejmowanie jest operacją arytmetyczną i nie jest zdefiniowane dla łańcuchów). Kiedy MySQL konwertuje ciągi znaków na liczby, zatrzymuje się na pierwszym znaku, który nie jest cyfrą. W zależności od danych, które przechowujesz w kolumnie
order_line_groups.sequence
, mniej lub więcej jego wartości ciągu zostanie przekonwertowane na liczbę0
.
Odnośnie szybkości, jak wyjaśniono na stronie dokumentacji podanej w pytaniu MySQL nie może używać indeksów do rozwiązania ORDER BY
. To spowalnia zapytanie.
Wniosek
Korzystanie z ORDER BY -order_line_groups.sequence
spowalnia zapytanie. Co więcej, nie zapewnia dobrego sposobu sortowania zestawu wyników, gdy typ kolumny sequence
jest typem ciągu.