Ingrid: SQL Sortieren, nächstes Datum oben

Hallo Ihr Lieben,

mit

  
SELECT *,  
DATE_FORMAT(datum, '%d.%m.%Y - %H:%i') AS datum_show,  
DATE_FORMAT(planung, '%d.%m.%Y - %H:%i') AS planung_show,  
UNIX_TIMESTAMP(datum) AS datum_unix,  
UNIX_TIMESTAMP(planung) AS planung_unix  
FROM `tabelle`  
WHERE (medium = '' AND status = '0')  
OR (UNIX_TIMESTAMP(planung) > UNIX_TIMESTAMP(datum) AND status = '0')  
ORDER BY planung desc, datum desc, prioritaet asc  
LIMIT 0,20  

mache ich eine Abfrage meiner Tabelle, wobei in 'datum' und 'planung' Datum und Zeit gespeichert sind.
In 'planung' stehen auch Angaben in der weiten Zukunft.
mit 'ORDER BY planung desc, datum desc, prioritaet asc' funktioniert die Sortierung natürlich, allerdings stehen ganz oben dann auch Einträge aus z.B. 2016 - ist ja logisch, wird ja quasi rückwärts sortiert.

Ich möchte aber, dass ganz oben die nächsten drei geplanten Einträge (in 'planung') von heute aus gesehen stehen, dann erst der Rest.

Das Problem ist, dass ich das alles in eine Abfrage packen muss ... könnt Ihr mir helfen?

Liebste Grüße, Eure Ingrid

  1. Tach!

    Ich möchte aber, dass ganz oben die nächsten drei geplanten Einträge (in 'planung') von heute aus gesehen stehen, dann erst der Rest.

    Man kann zwar die Datümer nach vor oder nach einem bestimmten Zeitpunkt unterscheiden (z.B. ORDER BY datum > NOW()), aber davon nur drei Stück nehmen, geht nicht so einfach. Dazu müssten ja die Datensätze in Bezug zueinander verglichen werden. Das ist so nicht vorgesehen, ein SQL-Server arbeitet eher mengenorientiert. Das heißt, du kannst zwas die drei nächste in der Zukunft, der Vergangenheit oder wenn du den Absolutbetrag der Differenz zu heute ausrechnest auch für beide ermitteln, indem du nur die zukünftigen oder vergangenen oder nach dieser Differenz sortierst und dann drei nimmst. Vom Rest der Datensätze könntest du diese drei ausschließen und ihn dann sortieren. Anschließend beides zusammenführen (UNION). Um den zweiten Teil zu ermitteln, müssten die drei Primärschlüssel des ersten Teils im WHERE-Teil ausgeschlossen werden, was mit einem Subselect ginge. Somit wäre die erste Query zum großen Teil ein weiteres mal in der Query aufzuführen.

    dedlfix.