2013-07-11 10 views
24

C'è un campo 'noticeBy' enum ('email', 'mobile', 'all', 'auto', 'nothing') NOT NULL DEFAULT 'auto'. Come noto, l'ordinamento da parte del campo ENUM è relativo al suo indice. Tuttavia, come è possibile fare ordine con i suoi valori?ORDINA DA "campo ENUM" in MYSQL

risposta

43

Come documentato in Sorting:

ENUM i valori sono ordinati in base ai loro numeri di indice, che dipendono dall'ordine in cui i membri di enumerazione sono stati elencati nella specifica della colonna. Ad esempio, 'b' ordina prima di 'a' per ENUM('b', 'a'). La stringa vuota ordina le stringhe non vuote e i valori NULL vengono ordinati prima di tutti gli altri valori di enumerazione.

Per evitare risultati imprevisti quando si utilizza la clausola ORDER BY su una colonna ENUM, utilizzare una di queste tecniche:

  • specificare l'elenco ENUM in ordine alfabetico.

  • Assicurarsi che la colonna sia ordinata in modo lessicale anziché per numero di indice tramite la codifica ORDER BY CAST(col AS CHAR) o ORDER BY CONCAT(col).

Per il secondo punto, si può dunque sorta sulla colonna dopo che è stato cast in una stringa:

ORDER BY CAST(noticeBy AS CHAR) 
9

È possibile definire l'ordine come preferisci:

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

Ciò restituirà le righe nel seguente ordine: e-mail, cellulare, tutto, auto, niente.

+0

Questo funzionerà in SQLite troppo. – nuqqsa

31

Questo funziona anche:

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

(non credo che ci sia un'impostazione per raggiungere questo obiettivo, è necessario fornire il tipo-valori.)

+2

Questo modo di ordinare ENUM può essere molto utile in alcuni casi! Funziona davvero, l'ho provato :) –

+0

perfetto esattamente quello che stavo cercando – Andrew