Wie definiere ich einen benutzerdefinierten ORDER BY-Auftrag in mySQL?

In MySQL definiere ich eine benutzerdefinierte Sortierreihenfolge.

Um zu versuchen zu erklären, was ich will, beachte 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 sortiert nach Sprache und aufsteigender ID zurückgeben, so dass Language = ENU zuerst kommt, dann JPN und zuletzt DAN.

Das Ergebnis sollte sein: a, d, b, e, c, f etc.

Ist das überhaupt möglich?

MySQL hat eine praktische function namens FIELD() die für FIELD() Aufgaben hervorragend geeignet ist.

ORDER BY FIELD(Language,'ENU','JPN','DAN'), ID

Beachten Sie jedoch, dass

  1. Dadurch wird Ihr SQL weniger portierbar, da andere DBMS möglicherweise keine solche function haben

  2. Wenn Ihre Liste von Sprachen (oder anderen Werten, nach denen sortiert werden soll) viel länger wird, ist es besser, eine separate Tabelle mit der Spalte sortorder für sie zu haben und diese Ihren Abfragen für die Bestellung beizugeben.

Wenn dies die einzigen drei Werte sind, können Sie einen CASE Ausdruck verwenden :

 ORDER BY `ID`, CASE `Language` WHEN 'ENU' THEN 1 WHEN 'JPN' THEN 2 WHEN 'DAN' THEN 3 END 

(Wenn andere Werte vorhanden sein könnten, möchten Sie möglicherweise zusätzliche Logik hinzufügen, um die Reihenfolge konsistent zu halten. Sie können beispielsweise ELSE 4 zu diesem CASE Ausdruck hinzufügen und dann nach Language selbst als drittes Sortierkriterium sortieren:

 ORDER BY `ID`, CASE `Language` WHEN 'ENU' THEN 1 WHEN 'JPN' THEN 2 WHEN 'DAN' THEN 3 ELSE 4 END, `Language` ) 

Sie haben ein paar Optionen zur Hand, die erste ist, Sprache zu ENUM zu wechseln (vorausgesetzt, das ist möglich, und Sie erwarten nur ein paar Variationen)

Wenn Sie es als ENUM('ENU','JPN','DAN') angeben, wird ORDER Language ASC in der von Ihnen angegebenen Reihenfolge bestellen.

Die zweite wird irgendwo einen Fall beinhalten, d

 SELECT * FROM table ORDER BY CASE Language WHEN 'ENU' THEN 3 WHEN 'JPN' THEN 2 WHEN 'DAN' THEN 1 ELSE 0 END DESC, ID ASC 

performancesmäßig wird die ENUM-Methode schnellere Ergebnisse liefern, aber Sie müssen mehr Mühe haben, 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 übertrieben ist.