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
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ürENUM('b', 'a')
. Die leere Zeichenfolge sortiert vor nicht leeren Strings und die WerteNULL
sortieren vor allen anderen Enumerationswerten.Um unerwartete Ergebnisse zu verhindern, wenn die
ORDER BY
Klausel auf eineENUM
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)
oderORDER 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)
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.
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.)
Diese Art der Sortierung von ENUM kann in einigen Fällen sehr nützlich sein! Es funktioniert wirklich, ich habe es versucht :) –
perfekt genau das, was ich gesucht habe – Andrew
Dieser wird auch in SQLite arbeiten. – nuqqsa