フィールド 'noticeBy' enum( 'email'、 'mobile'、 'all'、 'auto'、 'nothing')NOT NULL DEFAULT 'auto'があります。既知のように、ENUMフィールドによる順序付けは、そのインデックスに関連して実行されます。しかし、その値でどのように順序付けが可能ですか?
仕分け で文書化されているとおり:
ENUM
値は、インデックス番号に基づいてソートされます。インデックス番号は、列の仕様で列挙メンバーがリストされた順序に依存します。たとえば、ENUM('b', 'a')
の場合、_'b'
_は_'a'
_の前にソートされます。空の文字列は空でない文字列の前にソートされ、NULL
値は他のすべての列挙値の前にソートされます。
ENUM
列で_ORDER BY
_句を使用するときに予期しない結果を防ぐには、次のいずれかの方法を使用します。
ENUM
リストをアルファベット順に指定します。
ORDER BY CAST(col AS CHAR)
またはORDER BY CONCAT(col)
をコーディングして、列がインデックス番号ではなく字句的にソートされていることを確認してください。
したがって、2番目の箇条書きでは、列に cast を追加した後に列で並べ替えることができます。
_ORDER BY CAST(noticeBy AS CHAR)
_
これも機能します:
ORDER BY FIELD(noticeBy, 'all','auto','email','mobile','nothing')
(これを実現する設定があるとは思わないので、ソート値を指定する必要があります。)
注文は自由に定義できます:
ORDER BY CASE noticeBy
WHEN 'email' THEN 1
WHEN 'mobile' THEN 2
WHEN 'all' THEN 3
WHEN 'auto' THEN 4
ELSE 5
END
これは、電子メール、モバイル、すべて、自動、なしの順に行を返します。
私の場合、列挙結果を「ENUM」フィールドでソートし、値が降順であることを確認する必要がありました。私の列挙型には次の値がありました:_'Open','Closed'
_
したがって、ORDER BY CAST(status AS CHAR)
を使用した場合、結果は次の順序でした。
_Closed
Open
Open
_
しかし、最初にOpen
ステータスチケットを表示し、次にClosed
チケットを表示したかったのです。そこで、次を使用しました。
ORDER BY CAST(status AS CHAR) DESC
これは私が探していた注文、つまり.
_Open
Open
Closed
_
概要:
Enumで_ORDER BY CAST
_を使用するだけでは役に立ちません。結果を特定の順序で並べ替えるには、ASC
またはDESC
にも言及してトリックを行いました。