ORDER BY Datum mit vergangenen Daten nach den nächsten Daten

8

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

    
AleCat83 11.09.2012, 07:58
quelle

3 Antworten

11

Sie können die CASE -Anweisung auch in ORDER BY clause,

ausführen %Vor%     
John Woo 11.09.2012 08:01
quelle
4

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.

    
paxdiablo 11.09.2012 08:04
quelle
0

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.

    
Amorphous 16.04.2014 10:31
quelle

Tags und Links