web-dev-qa-db-ja.com

MYSQLのORDER BY "ENUMフィールド"

フィールド 'noticeBy' enum( 'email'、 'mobile'、 'all'、 'auto'、 'nothing')NOT NULL DEFAULT 'auto'があります。既知のように、ENUMフィールドによる順序付けは、そのインデックスに関連して実行されます。しかし、その値でどのように順序付けが可能ですか?

33

仕分け で文書化されているとおり:

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)
_
55
eggyal

これも機能します:

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

(これを実現する設定があるとは思わないので、ソート値を指定する必要があります。)

47
Andy G

注文は自由に定義できます:

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

これは、電子メール、モバイル、すべて、自動、なしの順に行を返します。

14
Fabian Bigler

私の場合、列挙結果を「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にも言及してトリックを行いました。

0
Devner