SELECT
あらかじめ決められた順序でステートメントを実行することは可能ですか? ID 7、2、5、9、および 8 を選択し、ID フィールドだけに基づいてその順序で返しますか?
これらのステートメントは両方とも同じ順序でそれらを返します。
SELECT id FROM table WHERE id in (7,2,5,9,8)
SELECT id FROM table WHERE id in (8,2,5,9,7)
SELECT
あらかじめ決められた順序でステートメントを実行することは可能ですか? ID 7、2、5、9、および 8 を選択し、ID フィールドだけに基づいてその順序で返しますか?
これらのステートメントは両方とも同じ順序でそれらを返します。
SELECT id FROM table WHERE id in (7,2,5,9,8)
SELECT id FROM table WHERE id in (8,2,5,9,7)
これが可能だとは思いませんでしたが、あなたが求めているのと同じようなことをしているように見えるブログエントリを見つけました:
SELECT id FROM table WHERE id in (7,2,5,9,8)
ORDER BY FIND_IN_SET(id,"7,2,5,9,8");
に異なる結果を与える
SELECT id FROM table WHERE id in (7,2,5,9,8)
ORDER BY FIND_IN_SET(id,"8,2,5,9,7");
FIND_IN_SET
id
は、与えられた 2 番目の引数の位置を返します。したがって、上記の最初のケースでは、 id
of 7 はセット内の位置 1 にあり、2 は 2 にあり、以下同様です。
id | FIND_IN_SET
---|-----------
7 | 1
2 | 2
5 | 3
の結果で注文しますFIND_IN_SET
。
あなたの最善の策は:
ORDER BY FIELD(ID,7,2,4,5,8)
...しかし、それはまだ醜いです。
ID 7、2、5、... を序数 1、2、3、... にマップする case 式を含めて、その式で並べ替えていただけますか?
この辺りですぐに答えが返ってきますね…</p>
私がこれを求めている理由は、複雑な多次元配列のソートを回避するために私が考えることができる唯一の方法だからです。並べ替えが難しいと言っているわけではありませんが、ストレートSQLを使用して並べ替えるより簡単な方法があれば、そうしないでください。
すべての順序付けは ORDER BY キーワードによって行われますが、昇順と降順でのみ並べ替えることができます。PHP などの言語を使用している場合は、いくつかのコードを使用してそれに応じて並べ替えることができますが、MySQL だけでは可能ではないと思います。
これはOracleで機能します。MySqlで同様のことができますか?
SELECT ID_FIELD
FROM SOME_TABLE
WHERE ID_FIELD IN(11,10,14,12,13)
ORDER BY
CASE WHEN ID_FIELD = 11 THEN 0
WHEN ID_FIELD = 10 THEN 1
WHEN ID_FIELD = 14 THEN 2
WHEN ID_FIELD = 12 THEN 3
WHEN ID_FIELD = 13 THEN 4
END
自動採番フィールドを含む一時テーブルを作成し、目的の順序で挿入する必要がある場合があります。次に、新しい autonumber フィールドで並べ替えます。
ハックですが (そしておそらく遅いです)、UNION ALL で効果を得ることができます:
SELECT id FROM table WHERE id = 7
UNION ALL SELECT id FROM table WHERE id = 2
UNION ALL SELECT id FROM table WHERE id = 5
UNION ALL SELECT id FROM table WHERE id = 9
UNION ALL SELECT id FROM table WHERE id = 8;
編集:他の人は、ここに文書化されている find_in_set 関数について言及しました。
ええと、そうではありません。あなたが得ることができる最も近いものはおそらく:
SELECT * FROM table WHERE id IN (3, 2, 1, 4) ORDER BY id=4, id=1, id=2, id=3
しかし、あなたはおそらくそれを望んでいません:)
表の内容に関する詳細情報がなければ、これ以上具体的なアドバイスを提供することは困難です。
1 つの Oracle ソリューションは次のとおりです。
SELECT id FROM table WHERE id in (7,2,5,9,8)
ORDER BY DECODE(id,7,1,2,2,5,3,9,4,8,5,6);
これにより、各 ID に注文番号が割り当てられます。値のセットが小さい場合は問題なく動作します。
私が考えることができる最善の方法は、2 番目の列 orderColumn を追加することです。
7 1
2 2
5 3
9 4
8 5
そして、ORDER BY orderColumn を実行します。