IN() 句内の値の順序で並べ替える方法 (おそらくもっと良い方法) があるかどうか疑問に思っています。
問題は、クエリが 2 つあることです。1 つはすべての ID を取得し、もう 1 つはすべての情報を取得します。最初のクエリは、2 番目のクエリで並べ替える ID の順序を作成します。ID は、正しい順序で IN() 句に配置されます。
つまり、次のようになります(非常に簡略化されています)。
SELECT id FROM table1 WHERE ... ORDER BY display_order, name
SELECT name, description, ... WHERE id IN ([id's from first])
問題は、2 番目のクエリが、ID が IN() 句に入力された順序と同じ順序で結果を返さないことです。
私が見つけた解決策の 1 つは、すべての ID を自動増分フィールドを持つ一時テーブルに格納し、それを 2 番目のクエリに結合することです。
もっと良い選択肢はあるでしょうか?
注記:最初のクエリは「ユーザーによって」実行され、2 番目のクエリはバックグラウンド プロセスで実行されるため、サブクエリを使用して 2 つのクエリを 1 つのクエリに結合する方法はありません。
私は MySQL を使用していますが、他の DB にもどのようなオプションがあるかが記載されていると便利だと思います。
ベストアンサー1
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()
ID を句とFIELD()
関数に同じ順序で貼り付けると、まさに必要な処理が実行されます。