MySQL: CASE im ORDER BY
Fabienne
- datenbank
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
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
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
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
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?
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
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!
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";