christian: MySQL: Mehrere Kriterien nach "ORDER BY"

Hallo,
ich starte mit PHP eine Datenbankabfrage. Die Datensätze will ich nach Zeitpunkt der Eintragung ordnen lassen. Dafür gibt es eine Spalte mit dem Typ 'datetime'. Aus verschiedenen Gründen ist es unumgänglich, dass manche Datensätze den Wert '0000-00-00 00:00:00' besitzen. Diese Datensätze werden beim Ordnen (per DESC) immer zuerst ausgegeben. Um hier eine zweite Ordnung reinzubringen habe ich folgendes angegeben:

ORDER BY 'zeit','id'

Das Problem ist jetzt, dass die Datensätze mit '0000-00-00 00:00:00' nun IMMER als erstes ausgeben werden, egal ob ich per DESC oder per ASC sortieren lasse, da anscheinend die Sortierung nach 'id' nicht zweitrangig behandelt wird.
Hier ein Beispiel:

...Order BY 'zeit','id' ASC

id| zeit
1 | 0000-00-00 00:00:00
2 | 0000-00-00 00:00:00
3 | 2009-01-01 10:00:00

...Order BY 'zeit','id' DESC
id| zeit
1 | 0000-00-00 00:00:00
2 | 0000-00-00 00:00:00
3 | 2009-01-01 10:00:00

Eigentlich müsste beim ersten Beispiel die Datensätze 1 und 2 als letztes Ausgegeben werden.
Wie löse ich das Problem?

christian

  1. Hallo christian,

    Order BY 'zeit','id' DESC

    Du musst DESC pro ORDER- Feld angeben, also Order BY 'zeit' DESC,'id' DESC

    SQL hat dir wie gewünscht (voreingestellt) die Zeit aufsteigend sortiert.

    Kalle

    1. Kann es sein, dass du _gültige_ Zeiten vorne haben willst, aber aufsteigend?

      SELECT
      ...
      ,IF(zeit='0000-00-00 00:00:00', 1, 0) sort
      ...
      ORDER BY sort, ...

      Wenn die Zeit 00.. ist, wird ein Wert 1 gesetzt, sonst 0. Beim Sortieren kommen die 0er (gültige Zeit) vor den 1ern.

      Kalle

      1. SELECT
        ...
        ,IF(zeit='0000-00-00 00:00:00', 1, 0) sort
        ...
        ORDER BY sort, ...

        Wenn die Zeit 00.. ist, wird ein Wert 1 gesetzt, sonst 0. Beim Sortieren kommen die 0er (gültige Zeit) vor den 1ern.

        Wie muss die Abfrage dann genau aussehen?

        SELECT *  FROM tabelle ,IF(zeit='0000-00-00 00:00:00', 1, 0) sort Order BY sort

        Das funktioniert irgendwie nicht...

        1. SELECT *  FROM tabelle ,IF(zeit='0000-00-00 00:00:00', 1, 0) sort Order BY sort

          Das funktioniert irgendwie nicht...

          Ach so, es fehlt an Grundlagen. Das Feld sort gehört zum SELECT:

          SELECT
           *
          ,IF(zeit='0000-00-00 00:00:00', 1, 0) sort
          FROM ...
          WHERE ...
          ORDER BY sort, zeit

  2. yo,

    ...Order BY 'zeit','id' ASC

    was sollen eigentlich die ' zeichen um die spaltennamen herum bewirken ?

    Ilja