Wie definiere ich in MySQL eine benutzerdefinierte Sortierreihenfolge?
Um zu erklären, was ich möchte, betrachten Sie diese Tabelle:
ID Language Text
0 ENU a
0 JPN b
0 DAN c
1 ENU d
1 JPN e
1 DAN f
2 etc...
Hier möchte ich alle Zeilen zurückgeben, die nach Sprache und aufsteigender ID sortiert sind, sodass zuerst Sprache = ENU, dann JPN und zuletzt DAN steht.
Das Ergebnis sollte sein: a, d, b, e, c, f usw.
Ist das überhaupt möglich?
GROUP BY
vorher haben? Zum Beispiel erscheint der erste gewünschte Wert am Ende?GROUP BY
Fügen Sie die Abfrage mit in eine Unterabfrage ein und ordnen Sie sie in der äußeren Abfrage anWenn dies die einzigen drei Werte sind, können Sie einen
CASE
Ausdruck verwenden :(Wenn es andere Werte geben könnte, möchten Sie möglicherweise eine zusätzliche Logik hinzufügen, um die Reihenfolge konsistent zu halten. Sie können beispielsweise
ELSE 4
diesenCASE
Ausdruck hinzufügen und dannLanguage
als drittes Ordnungskriterium selbst sortieren:)
quelle
Sie haben sofort mehrere Optionen. Die erste besteht darin, die Sprache in ENUM zu ändern (vorausgesetzt, dies ist möglich und Sie erwarten nur wenige Variationen).
Wenn Sie es angeben , wie
ENUM('ENU','JPN','DAN')
dannORDER Language ASC
werden Sie in der Reihenfolge angeben bestellen.Der zweite wird irgendwo einen Fall betreffen, dh
In Bezug auf die Leistung liefert die ENUM-Methode schnellere Ergebnisse, ist jedoch problematischer, wenn Sie weitere Sprachen hinzufügen müssen. Eine dritte Option wäre das Hinzufügen einer Normalisierungstabelle für die Sprachen, die in diesem Fall jedoch möglicherweise übertrieben ist.
quelle
ENUM('ENU','JPN','DAN')
?END DESC,
seinEND CASE DESC,
?CASE
brauchenEND CASE
, es hängt vom Kontext ab.CASE
innerhalb von PROCEDURE erfordernEND CASE
( dev.mysql.com/doc/refman/5.5/en/case.html ), jedochCASE
innerhalb von SELECT nicht erforderlichEND CASE
, einfachEND
( dev.mysql.com/doc/refman/5.7/en/… ) - in diesem Kontext ist es eine Kontrollflussfunktion.Für das Yii2-Framework können wir Folgendes erreichen
quelle