16

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)
4

11 に答える 11

37

これが可能だとは思いませんでしたが、あなたが求めているのと同じようなことをしているように見えるブログエントリを見つけました:

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_SETidは、与えられた 2 番目の引数の位置を返します。したがって、上記の最初のケースでは、 idof 7 はセット内の位置 1 にあり、2 は 2 にあり、以下同様です。

id | FIND_IN_SET
---|-----------
7  | 1
2  | 2
5  | 3

の結果で注文しますFIND_IN_SET

于 2008-09-25T16:37:29.977 に答える
3

あなたの最善の策は:

ORDER BY FIELD(ID,7,2,4,5,8) 

...しかし、それはまだ醜いです。

于 2008-09-25T16:42:45.440 に答える
1

ID 7、2、5、... を序数 1、2、3、... にマップする case 式を含めて、その式で並べ替えていただけますか?

于 2008-09-25T16:36:44.097 に答える
0

この辺りですぐに答えが返ってきますね…</p>

私がこれを求めている理由は、複雑な多次元配列のソートを回避するために私が考えることができる唯一の方法だからです。並べ替えが難しいと言っているわけではありませんが、ストレートSQLを使用して並べ替えるより簡単な方法があれば、そうしないでください。

于 2008-09-25T16:47:18.220 に答える
0

すべての順序付けは ORDER BY キーワードによって行われますが、昇順と降順でのみ並べ替えることができます。PHP などの言語を使用している場合は、いくつかのコードを使用してそれに応じて並べ替えることができますが、MySQL だけでは可能ではないと思います。

于 2008-09-25T16:35:20.887 に答える
0

これは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
于 2008-09-25T16:36:26.373 に答える
0

自動採番フィールドを含む一時テーブルを作成し、目的の順序で挿入する必要がある場合があります。次に、新しい autonumber フィールドで並べ替えます。

于 2008-09-25T16:37:43.423 に答える
0

ハックですが (そしておそらく遅いです)、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 関数について言及しました。

于 2008-09-25T16:38:58.770 に答える
0

ええと、そうではありません。あなたが得ることができる最も近いものはおそらく:

SELECT * FROM table WHERE id IN (3, 2, 1, 4) ORDER BY id=4, id=1, id=2, id=3

しかし、あなたはおそらくそれを望んでいません:)

表の内容に関する詳細情報がなければ、これ以上具体的なアドバイスを提供することは困難です。

于 2008-09-25T16:39:42.607 に答える
0

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 に注文番号が割り当てられます。値のセットが小さい場合は問題なく動作します。

于 2008-12-04T20:18:47.923 に答える
-1

私が考えることができる最善の方法は、2 番目の列 orderColumn を追加することです。

7 1
2 2
5 3
9 4 
8 5

そして、ORDER BY orderColumn を実行します。

于 2008-09-25T16:39:20.533 に答える