Ich muss eine Abfrage für eine Tabelle in einer MySql-Datenbank ausführen, wobei die Reihenfolge der resultierenden Zeilen wie folgt lautet:
Wenn heute der 10/09/12 ist:
%Vor%Gibt es eine Möglichkeit, dies direkt in MySQL zu erreichen?
Ich habe das auf folgende Weise gelöst:
Zuerst enthält die select-Anweisung einen neuen booleschen Wert, der angibt, ob das Datum vergangen oder zukünftig ist:
%Vor%Zweitens habe ich eine doppelte 'Order by' gemacht: Zuerst auf den booleschen Wert von past_or_future und dann auf das Datum, mit der Bedingung wie folgt:
%Vor%auf diese Weise habe ich zunächst alle anstehenden Termine nach Datum sortiert (vom niedrigeren Wert bis höher), dann alle vergangenen Termine vom Datum (von oben nach unten) sortiert
Ja, ein Weg besteht darin, zwei Abfragen mit einem "leistungsstärkeren" Sortierschlüssel zusammenzuführen (ich verwende statt des Spaltennamens die Position):
%Vor% Was dies tun wird, ist die Verwendung von uberkey
als primäres Sortierfeld, so dass spätere Daten zuerst kommen. Sie können diese Spalte einfach ignorieren, wenn Sie die Daten anzeigen.
Dies kann oft effizienter sein, da pro-row-Funktionen wie case
seit case
in jeder Zeile eine Übersetzung ausführen müssen. Zwei Abfragen mit einer where
-Klausel können einfach einen Index verwenden, um die andere "Hälfte" der Zeilen wegzuwerfen und eine Konstante für die abgerufenen zu verwenden.
Und (obwohl ich keine besonderen Kenntnisse über MySQL habe, bin ich selbst ein DB2-Mann), kann ein intelligentes DBMS die beiden Unterkomponenten der Abfrage tatsächlich auf Effizienz parallelisieren.
Wie bei allen Unionen sollten Sie union all
verwenden, wenn die beiden Unterkomponenten sich gegenseitig ausschließen, so dass keine unnötige Operation zum Sortieren und Entfernen von Duplikaten erforderlich ist.
Normalerweise können Sie eine Spalte nicht in beide Richtungen sortieren, ohne UNION zu verwenden. UNION hat einige Nachteile, besonders wenn Sie ORM verwenden. Wenn Sie möchten, dass Sie mit der kommenden ASC die vorherige DESC bestellen, können Sie es mit Trick tun:
SELECT yourDateColumn, IF (yourDateColumn)
Sie können es auch mit ORM verwenden und weiterhin Paginatoren usw. verwenden.