回答:
MySQLには、FIELD()このようなタスクに最適な便利な関数があります。
ORDER BY FIELD(Language,'ENU','JPN','DAN'), ID
ただし、
他のDBMSにはそのような機能がない可能性があるため、SQLの移植性が低下します
言語のリスト(またはその他のソート値)がはるかに長くなる場合は、それらのsortorder列を備えた別のテーブルを用意し、それをクエリに結合して並べ替えることをお勧めします。
GROUP BY前に持っている場合はどうなりますか?たとえば、最初に必要な値が最後に表示されますか?
GROUP BYサブクエリに入れて、外部クエリで
これらが3つの値のみの場合、CASE式を使用できます。
ORDER BY `ID`,
CASE `Language`
WHEN 'ENU' THEN 1
WHEN 'JPN' THEN 2
WHEN 'DAN' THEN 3
END
(他の値が存在する可能性がある場合は、順序を一貫させるためにいくつかの追加のロジックを追加ELSE 4することができます。たとえば、そのCASE式に追加してLanguage、3番目の順序付け基準としてそれ自体で順序付けすることができます。
ORDER BY `ID`,
CASE `Language`
WHEN 'ENU' THEN 1
WHEN 'JPN' THEN 2
WHEN 'DAN' THEN 3
ELSE 4
END,
`Language`
)
いくつかのオプションがありますが、1つ目は、言語をENUMに変更することです(これが可能であり、いくつかのバリエーションしか期待できない場合)。
あなたはそれを指定した場合などENUM('ENU','JPN','DAN')、その後ORDER Language ASC、指定した順番で注文します。
2つ目は、どこかのケースに関係します。
SELECT * FROM table
ORDER BY CASE Language
WHEN 'ENU' THEN 3
WHEN 'JPN' THEN 2
WHEN 'DAN' THEN 1
ELSE 0
END DESC, ID ASC
ENUMメソッドはパフォーマンス面でより高速な結果を返しますが、言語を追加する必要がある場合は面倒です。3番目のオプションは、言語の正規化テーブルを追加することですが、この場合はやりすぎかもしれません。
ENUM('ENU','JPN','DAN')か?
END DESC,ないEND CASE DESC,?
CASEが必要というわけではありませんEND CASE。それはコンテキストに依存しています。 CASE手順内ではrequire END CASE(dev.mysql.com/doc/refman/5.5/en/case.html)がCASE必要ですがEND CASE、SELECT内では単純にEND(dev.mysql.com/doc/refman/5.7/en/… )が必要です-これでコンテキストこれは制御フロー関数です。