質問

あらかじめ決められた順序で 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 の位置にあります。mysql は内部的に次のように処理します。

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、...そしてその表現で注文するのですか?

すべての順序付けは 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

場合によっては、自動採番フィールドを含む一時テーブルを作成し、希望の順序でそこに挿入する必要があります。次に、新しい自動番号フィールドで並べ替えます。

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

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

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

表の内容についての詳しい情報がなければ、これ以上具体的なアドバイスを与えることは困難です。

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

このあたりではすぐに答えが得られますね…

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

Oracle のソリューションの 1 つは次のとおりです。

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 を実行するだけです

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top