Ich habe eine Aufzählung: ENUM( 'alpha', 'beta', 'gamma', 'delta', 'omega' )
Wenn ich meine Tabelle nach dieser Spalte sortiere, erhalte ich sie in der oben definierten Reihenfolge.
Ich kann jedoch keinen Weg finden, eine Teilmenge von diesen auszuwählen, z. alles vor dem Delta. Die Verwendung von WHERE status < 'delta'
gibt nur Alpha und Beta zurück, nicht Gamma. Es sieht so aus, als ob MySQL einen String-Vergleich verwendet, nicht einen Enum-Index-Vergleich.
Ich könnte die Indexzahlen verwenden - also WHERE status < 4
- aber es ist ein bisschen ein Code-Geruch (magische Zahlen) und kann brechen, wenn ich neue Werte in die Aufzählung einfüge.
Sie versuchen, Datenbearbeitungsmethoden für Metadaten zu verwenden, und das ist sicher umständlich.
Dies ist ein guter Grund, das ENUM
durch einen Fremdschlüssel in einer Nachschlagetabelle zu ersetzen. Dann können Sie herkömmliche Datenmanipulationstechniken verwenden.
Sie können status+0
verwenden, um den Index des ENUM beginnend mit 1 zurückzugeben.
Siehe Ссылка
ist gerade auf dasselbe Problem gestoßen. Wenn Sie ein enum-Feld sortieren wollen, müssen Sie es zuerst in einen String-Typ umwandeln (category ist mein enum-Feld im Beispiel):
%Vor%eazy!
Sie können FIELD(column, "string1", "string2", ...)
verwenden, um Zeilen mit allen zu finden bestimmte Teilmenge der möglichen ENUM
-Werte.
Wenn Sie die Bereichsversion verwenden möchten, können Sie FIND_IN_SET("needle", "hay,stack")
, um den Index zurückzugeben, aber Sie müssen zuerst die ENUM-Liste aus der Tabellendefinition mit einer anderen Abfrage extrahieren.
Erstellen Sie eine Funktion:
%Vor%Dann verwenden Sie es in einer Abfrage wie folgt:
%Vor% Die SELECT REPLACE(REPLACE(REPLACE(COLUMN_TYPE,''', ''',','),'enum(',''),')','')
wird die COLUMN_TYPE
wie ENUM( 'alpha', 'beta', 'gamma', 'delta', 'omega' )
nehmen und sie in eine kommagetrennte Liste verwandeln: 'alpha, beta, gamma, delta, omega'
. Dann erhält der FIND_IN_SET(_val, _lst)
den Index.
Sie müssen nur darauf achten, wie Sie die ENUMs (mit oder ohne Leerzeichen zwischen den Elementen) und die innerste REPLACE
(mit oder ohne Leerzeichen im from_string) definieren.