2009-07-05 42 views
3

Ich habe "Aufgaben" Tabelle mit drei Feldern:Bedingtes Sortieren in MySQL?

  1. Datum
  2. Priorität (0,1,2)
  3. done (0,1)

Was ich versuche zu erreichen ist mit der ganzen Tabelle sortiert nach getan Flag, Aufgaben, die nicht getan werden, sollten nach Priorität sortiert werden, während Aufgaben, die getan werden, sollten nach Datum sortiert werden:

  1. Select * von Aufgaben, um durch getan asc
  2. Wenn dies geschehen ist = 0 zusätzlich um nach Priorität ab
  3. Wenn dies geschehen = 1 zusätzlich nach Datum geordnet ab

Ist es möglich, ohne die Gewerkschaften dies in MySQL zu tun?

Danke.

Antwort

12

Sie ORDER BY (done asc, aux desc) versuchen könnten, wo aux mit einem CASE berechnet wird entweder Priorität oder Datum auf dem Wert von done Basis erhalten wird (man muss sich auf den gleichen Typen umwandeln kann in dem gleichen Ausdruck zu passen, zum Beispiel warf das Datum eine geeignete ganzzahlige Tageszahl).

Zum Beispiel:

SELECT * FROM tab 
ORDER BY done desc, 
     case done 
      when 0 then prio 
      else to_days(thedate) 
     end desc; 
+0

Danke, das (auch ohne TO_DAYS) arbeitet – serg

+0

Ah Ich schätze, MySQL wird dann automatisch umgewandelt - na ja, es ist immer schwer zu erraten, wo MySQL automatisch schreibt und wo nicht! -) –

7

Genommen von Alex Martelli nur ein bisschen mit IF() verkürzt und fixiert den ASC/DESC Bestellung

SELECT * FROM tab 
ORDER BY done ASC, IF(done, to_days(thedate), prio) DESC;