2013-07-11 11 views
24

Es gibt ein Feld 'noticeBy' enum ('E-Mail', 'mobile', 'alle', 'auto', 'nichts') NOT NULL DEFAULT 'auto'. Wie es bekannt ist, verhält sich das Ordnen durch das ENUM-Feld relativ zu seinem Index. Wie aber macht es Ordnung durch seine Werte?ORDER BY "ENUM Feld" in MYSQL

Antwort

43

Wie unter Sorting dokumentiert:

ENUM Werte werden basierend auf ihren Indexnummern sortiert, die von der Reihenfolge abhängen, in der die Aufzählungselemente in der Spaltenspezifikation aufgeführt wurden. Beispiel: 'b' sortiert vor 'a' für ENUM('b', 'a'). Die leere Zeichenfolge sortiert vor nicht leeren Strings und die Werte NULL sortieren vor allen anderen Enumerationswerten.

Um unerwartete Ergebnisse zu verhindern, wenn die ORDER BY Klausel auf eine ENUM Spalte, eine dieser Techniken verwenden:

  • Geben Sie die ENUM Liste in alphabetischer Reihenfolge.

  • Stellen Sie sicher, dass die Spalte lexikalisch sortiert ist und nicht nach Indexnummer, indem Sie ORDER BY CAST(col AS CHAR) oder ORDER BY CONCAT(col) codieren.

Per zweiten Kugel, können Sie daher sortieren auf der Säule, nachdem es cast gewesen in einen String hat:

ORDER BY CAST(noticeBy AS CHAR) 
9

Sie können Ihre Bestellung definieren wie Sie wollen:

ORDER BY CASE noticeBy 
      WHEN 'email' THEN 1 
      WHEN 'mobile' THEN 2 
      WHEN 'all' THEN 3 
      WHEN 'auto' THEN 4 
      ELSE 5 
     END 

Dadurch werden die Zeilen in der folgenden Reihenfolge zurück: E-Mail, Handy, alles, Auto, nichts.

+0

Dieser wird auch in SQLite arbeiten. – nuqqsa

31

Dies funktioniert auch:

ORDER BY FIELD(noticeBy, 'all','auto','email','mobile','nothing') 

(ich glaube nicht, dass es eine Einstellung, um dies zu erreichen ist, können Sie die Art-Werte zu bieten haben.)

+2

Diese Art der Sortierung von ENUM kann in einigen Fällen sehr nützlich sein! Es funktioniert wirklich, ich habe es versucht :) –

+0

perfekt genau das, was ich gesucht habe – Andrew