• ベストアンサー

INで抽出した順番に並び替え(SQL)

MySQLでINで抽出した順番で並び替えて表示したいのですが、簡単に行う方法はありませんか? [例] SELECT ID,NAME FROM TABLE WHERE ID IN (5,7,3); このSELECT文の抽出結果を5,7,3の順番に並び替えたいのです。 もちろん力技で行うこと(1つずつSELECTで抽出して表示)は可能なのですが、あまりにもスマートではないので・・・。

質問者が選んだベストアンサー

  • ベストアンサー
回答No.4

>FIELDの商品コードを'で囲んだところ、 >エラーは出なくなりましたが並び替えは上手くいきませんでした。 「'」(アポストロフィー)で囲んでしまうと、文字定数となるので、FIELD関数は正しく動作しません。 予約語と同じキーワードを使う場合は、「`」(バッククォート)を使いますが、今回は日本語の列名ということで該当しません。 MySQL 5.0では、下記SQLで動作しました。 SELECT 商品コード,商品名 FROM 商品マスタ WHERE 商品コード IN (5,7,3) ORDER BY FIELD(商品コード,5,7,3); マニュアルを見る限り、FIELD関数は昔からあるようです。#2回答者さんへのお礼にある「使えなかった」とは、具体的にどうなるのでしょうか? 下記のSQL例のように、CASEでも同様の結果を得られます。 SELECT 商品コード,商品名 FROM 商品マスタ WHERE 商品コード IN (5,7,3) ORDER BY CASE 商品コード WHEN 5 THEN 1 WHEN 7 THEN 2 WHEN 3 THEN 3 END; なお、ORDER BYで列名でなく式を指定した場合、インデクスを使ったソート抑止は行えませんので注意してください。 →商品コードで絞り込んだ後なので、今回は問題ないとも思いますけどね。

kanata_005
質問者

お礼

構文エラーが出ていたのですが、 今再確認したところ無事に動作しました。 私のミスだったみたいです。 申し訳ありません。 詳細な説明をありがとうございました。

その他の回答 (3)

回答No.3

MySQLのバージョンは? 表名は、「TABLE」なのですか?そうすると、「`」で囲まないと、予約語で構文エラーになると思いますが? select `id`,`name` from `table` where `id` in(5,7,3) order by field(`id`,5,7,3);

kanata_005
質問者

お礼

ソートすることができました。 ありがとうございました!

kanata_005
質問者

補足

SELECT 商品コード,商品名 FROM 商品マスタ WHERE 商品コード IN (5,7,3) ORDER BY FIELD('商品コード',5,7,3); 実際には↑こうです。 FIELDの商品コードを'で囲んだところ、 エラーは出なくなりましたが並び替えは上手くいきませんでした。

  • mooboogie
  • ベストアンサー率68% (28/41)
回答No.2

SELECT ID,NAME FROM TABLE WHERE ID IN (5,7,3) ORDER BY FIELD( ID, 5,7,3 ); で、出来ます。ベストな方法かどうかは知りませんが。

kanata_005
質問者

お礼

> ORDER BY FIELD( ID, 5,7,3 ); これだけの記述で出来ればまさに望んだとおりなのですが、使えませんでした。

回答No.1

他の列などで、ソートするための情報(規則)はあるのですか? 規則性がないなら、case式などで与えるしかありません。

kanata_005
質問者

お礼

アドバイスありがとうございます。 規則性はありません。 規則性というよりは「5,7,3」の配列に 従った並び順にしたいのです。

関連するQ&A