Christian Kruse: MySQL - WHERE mit AS verwenden

Beitrag lesen

Moin Christoph,

die Lösung von dedlfix war leider nur auf den ersten Blick ok. UNION verbietet die ORDER BY in den SELECT's, die vereinigt werden sollen. Ein:

(

SELECT termin, auftrErledigt
FROM table
WHERE auftrErledigt = 0
ORDER BY termin ASC
)
UNION
(
SELECT termin, auftrErledigt
FROM table
WHERE auftrErledigt = 1
ORDER BY termin DESC
)


> ist witzlos, da MySQL das ORDER BY automatisch herausoperiert (es sei denn, es wird in Verbindung mit einem LIMIT innerhalb der SELECT's verwendet).  
  
Ich hab keine Ahnung, ob MySQL das unterstützt, ich hab gerad keine funktionierende MySQL-Installation hier, aber SQL erlaubt Prinzipiell sowas hier:  
  
~~~sql
  
SELECT * FROM (  
  (SELECT termin, auftrErledigt  
  FROM `table`  
  WHERE auftrErledigt = 0  
  ORDER BY termin DESC)  
  UNION  
  (SELECT termin, auftrErledigt  
  FROM `table`  
  WHERE auftrErledigt = 1  
  ORDER BY termin ASC)  
) AS auftraege;  

Einen Versuch ist es wert. Prinzipiell würde ich aber auch eher den Ansatz von ChrisB wählen, allerdings in leicht anderer Form:

  
SELECT termin, auftrErledigt  
  FROM `table`  
  ORDER BY auftrErledigt,  
    CASE  
      WHEN auftrErledigt = 0 THEN termin  
      ELSE UNIX_TIMESTAMP(termin) * -1  
    END;  

Das selektiert dir zuerst die Reihen mit auftrErledigt = 0 (oder 1, je nachdem ob DESC oder ASC) und danach sortiert es dir innerhalb der auftrErledigt-Sortierung nach termin aufsteigend oder termin absteigend. Halte ich für einfacher als die temporäre Tabelle.

LG,
 CK