1. ホーム
  2. mysql

[解決済み] SQLのIN()句の値の順番で並べる

2022-04-24 20:44:38

質問

IN()句の値の順序で並べ替える方法(より良い方法)はないものかと考えています。

問題は、2つのクエリを持っていることです。1つはすべてのIDを取得し、もう1つはすべての情報を取得することです。最初のクエリでは、IDの順序を作成し、2番目のクエリで順序付けする必要があります。IDは正しい順序でIN()句に入れられます。

つまり、(極端に簡略化すると)こんな感じでしょうか。

SELECT id FROM table1 WHERE ... ORDER BY display_order, name

SELECT name, description, ... WHERE id IN ([id's from first])

問題は、2番目のクエリが、IN()句に入れられたIDと同じ順序で結果を返さないことです。

私が見つけた1つの解決策は、すべてのIDを自動インクリメントのフィールドを持つtempテーブルに入れ、それを2番目のクエリに結合することです。

もっと良い方法はないでしょうか?

最初のクエリはユーザーによって実行され、2番目のクエリはバックグラウンドプロセスで実行されるため、サブクエリを使って2つのクエリを1つにまとめる方法はありません。

私はMySQLを使用していますが、他のDBにもどのようなオプションがあるのかを記載してもらえると便利かと思います。

解決方法は?

MySQLの FIELD() 関数を使用します。

SELECT name, description, ...
FROM ...
WHERE id IN([ids, any order])
ORDER BY FIELD(id, [ids in order])

FIELD() は、最初のパラメータと等しいインデックスを返します(最初のパラメータ自身は除く)。

FIELD('a', 'a', 'b', 'c')

は1を返します。

FIELD('a', 'c', 'b', 'a')

は3を返します。

に貼り付けると、まさに思い通りの動作になります。 IN() 節と FIELD() 関数を同じ順序で実行します。