John A.: mysql, Sortierproblem

Ich habe ein Sortierproblem und zwar meine einzelnen Datensätze kann man über das Feld SORT sortieren

Datensatze

id titel sort
0 ALLES 0
1 titel1 1
2 titel2 2
3 titel3 0

SELECT *  FROM TABLE  ORDER BY SORT= 0,SORT ASC, id ASC

Die Ausgabe wäre dann

1 titel1 1
2 titel2 2
0 ALLES 0
3 titel3 0

soweit ok,

ich möchte aber der erste Datensatz (ALLES), der mit der id=0, immer an erster Stelle steht.

Für einen Tipp wäre ich dankbar

John

  1. Hi,

    ich möchte aber der erste Datensatz (ALLES), der mit der id=0, immer an erster Stelle steht.

    Die, bei denen sort=0 ist, ganz nach hinten sortieren zu lassen, bekommst du hin – aber wenn sort durch id ersetzt wird und sich die Sortierrichtung ändert, dann hast du plötzlich vergessen wie es gehen könnte …?

    MfG ChrisB

    --
    Autocomplete has spoiled me to a point where it happens every so often that I encounter a CAPTCHA, and I just type in the first character … and then wait for the rest of the code to be automatically suggested :/
  2. Hi John,

    ich möchte aber der erste Datensatz (ALLES), der mit der id=0, immer an erster Stelle steht.

    Für einen Tipp wäre ich dankbar

    Nun
    ORDER BY erstnachspalte1, dannnachspalte2 ;
    ASC ist aufsteigend (default - musst nicht schreiben)
    DESC ist absteigend
    NULLS FIRST am anfang
    NULLS LAST am ende

    probier doch mal aus:
    SELECT * FROM TABLE ORDER BY id NULLS FIRST, SORT;

    Viele Grüße aus LA

    --
    ralphi
    1. Tach!

      NULLS FIRST am anfang
      NULLS LAST am ende

      Das ist aber keine MySQL-Syntax. Zumindest steht da nichts auf der Seite zu SELECT. Und NULL ist auch nicht 0.

      probier doch mal aus:
      SELECT * FROM TABLE ORDER BY id NULLS FIRST, SORT;

      Mein Vorschlag ist, das erste Sortierkriterium sollte so lauten: IF(id = 0, 0, 1). Damit entstehen zwei Mengen, die mit der id=0 und "der Rest". Im Prinzip reicht ein Typecast nach Boolean, gibts aber nicht. SIGN(id) tut es in dem Fall sicher auch. Negative Werte für die id gibt es vermutlich nicht, so dass SIGN() nur 0 für die id 0 und in allen anderen Fällen 1 ergibt. Diese lassen sich dann mit einem zweiten Sortierkriterium (und gegebenenfalls weiteren) in die gewünschte Reihenfolge bringen.

      dedlfix.

      1. Hi,

        Das ist aber keine MySQL-Syntax. Zumindest steht da nichts auf der Seite zu SELECT. Und NULL ist auch nicht 0.

        stimmt, deshalb „mal ausprobieren“  ;-)
        ist Oraclezeug

        Mein Vorschlag ist, das erste Sortierkriterium sollte so lauten: IF(id = 0, 0, 1). Damit entstehen zwei Mengen, die mit der id=0 und "der Rest". Im Prinzip reicht ein Typecast nach Boolean, gibts aber nicht. SIGN(id) tut es in dem Fall sicher auch. Negative Werte für die id gibt es vermutlich nicht, so dass SIGN() nur 0 für die id 0 und in allen anderen Fällen 1 ergibt. Diese lassen sich dann mit einem zweiten Sortierkriterium (und gegebenenfalls weiteren) in die gewünschte Reihenfolge bringen.

        Kenn ich auch nicht :-(
        Kannst du die Beschreibung in eine SQL - Zeile packen, dass ich den Syntax sehen kann?

        Viele Grüße aus LA

        --
        ralphi
        1. Tach!

          Mein Vorschlag ist, das erste Sortierkriterium sollte so lauten: IF(id = 0, 0, 1). [...] SIGN(id) tut es in dem Fall sicher auch. [...] dann mit einem zweiten Sortierkriterium (und gegebenenfalls weiteren) in die gewünschte Reihenfolge bringen.
          Kannst du die Beschreibung in eine SQL - Zeile packen, dass ich den Syntax sehen kann?

          ORDER BY IF(id = 0, 0, 1), sort = 0, sort, id

          oder

          ORDER BY SIGN(id), sort = 0, sort, id

          Da die Intention hinter dem IF() im ersten Konstrukt besser zu erkennen ist als die vom SIGN() im zweiten, ist das IF() die bessere Wahl.

          dedlfix.