Fabienne: MySQL: CASE im ORDER BY

Hallo und guten Abend,

ich steh grad auf dem Schlauch:
Warum funktioniert folgende Sortierung nicht:

SELECT * FROM cugroup ORDER BY
CASE WHEN id<=10 THEN 'id ASC' ELSE 'name ASC' END

Ich möchte bei Einträgen mit ID kleiner als 10 nach der ID Sortiert haben, größer als 10 nach dem Name.
Also:
id | name
1  | Müller
2  | Meier
3  | Bauer
8  | Zych
9  | Adam
11 | AAA
13 | BBB
12 | CCC

Hat jemand meinen Fehler entdeckt?
Vielen Dank
Fabienne

  1. Hi,

    Warum funktioniert folgende Sortierung nicht:

    SELECT * FROM cugroup ORDER BY
    CASE WHEN id<=10 THEN 'id ASC' ELSE 'name ASC' END

    Weil du damit nach den *Stringwerten* 'id ASC' oder 'name ASC' sortierst.

    'id ASC' ist aber bei jedem Datensatz "gleich gross" wie 'id ASC', und 'name ASC' auch bei jedem "gleich gross" wie 'name ASC'.

    MfG ChrisB

    --
    „This is the author's opinion, not necessarily that of Starbucks.“
    1. Hi ChrisB

      Weil du damit nach den *Stringwerten* 'id ASC' oder 'name ASC' sortierst.

      und kannst Du mir noch auf die Sprünge helfen, wie ich nach den Spalten sortieren lassen kann mit der CASE-Bedingung?

      Besten Dank
      Fabienne

      1. yo,

        und kannst Du mir noch auf die Sprünge helfen, wie ich nach den Spalten sortieren lassen kann mit der CASE-Bedingung?

        lass einfach die einfachen anführungszeichen in der CASE anweisung weg, damit sie nicht als string zählen, sondern die werte der spalten genommen werden.

        Ilja

        1. auch YO!

          lass einfach die einfachen anführungszeichen in der CASE anweisung weg, damit sie nicht als string zählen, sondern die werte der spalten genommen werden.

          Da spuckt MySQL eine Fehlermeldung aus. Sonst wäre diese Lösung logisch gewesen.
          Es funkktioniert nur mit den Spaltennamen (id und name) nicht aber mit ASC und DESC.

          weitere Ideen?

          1. Hi,

            lass einfach die einfachen anführungszeichen in der CASE anweisung weg, damit sie nicht als string zählen, sondern die werte der spalten genommen werden.

            Da spuckt MySQL eine Fehlermeldung aus. Sonst wäre diese Lösung logisch gewesen.
            Es funkktioniert nur mit den Spaltennamen (id und name) nicht aber mit ASC und DESC.

            Da du (laut Beispiel) egal welche Spalte gewaehlt wird in die gleich "Richtung", ASC, sortieren willst, kannst du dir auch in der Spaltenliste nach SELECT Pseudo-Spalten selektieren lassen, und die dann zum Sortieren hernehmen.

            SELECT ...,
              IF(id<=10, 0, 1) AS nameoderid,
              IF(id<=10, id, name) AS sortiertwert
            FROM cugroup ORDER BY nameoderid ASC, sortiertwert ASC

            Das erste Sortierkriterium sorgt dafuer, dass alle Werte mit id<=10 vor den restlichen einsortiert werden, und das zweite dann innerhalb dieser Sortierung noch mal fuer die Sortierung jeweils nach id bzw. name.

            MfG ChrisB

            --
            „This is the author's opinion, not necessarily that of Starbucks.“
            1. So gehts:

              SELECT id, name,
                     if(id<=10, 0, 1) AS name_oder_id,
                     if(id<=10,id,0) AS sortierung_kleiner_zehn,
                     name AS sortierung_groesser_zehn
                  FROM tabelle
                  ORDER BY name_oder_id ASC, sortierung_kleine_zehn ASC, sortierung_groesser_zehn ASC

              Etwas umständlich aber es klappt!

  2. echo $begrüßung;

    Ich möchte bei Einträgen mit ID kleiner als 10 nach der ID Sortiert haben, größer als 10 nach dem Name.

    Ich denke, das wirst du nur mit zwei SELECTs und einem UNION dazwischen hinbekommen.

    Man kann zwar, wie auf der MySQL-Handbuchseite zur UNION Syntax steht, die einzelnen SELECTs sortieren, was aber für das Gesamtergebnis nichts nützt. Ich tät mir eine Sortierspalte in das Abfrageergebnis einbauen. Das erste SELECT, das nach ID < 10 filtert bekommt als Sortierspalteninhalt CONCAT('0', ID), die Sortierspalte des zweiten Selects besteht aus CONCAT('1', Name). Dann kannst du ein ORDER BY über das Gesamtergebnis legen und bekommst zuerst die IDs und dann die Namen. Wenn es umgedreht sein soll, tausch 0 und 1 aus.

    echo "$verabschiedung $name";