DEVELOPERS BLOGデベロッパーズブログ

  1. HOME > 
  2. 加藤 正人のデベロッパーズブログ > 
  3. MySQL で「指定した順序で結果を取得」

加藤 正人のデベロッパーズブログ

加藤 正人

氏名
加藤 正人
役職
多分SE
血液型
秘密
出没
美味しいもののあるところ
特色
タヒチ大好き。ちょいメタボ。

加藤 正人

2014/01/25

MySQL で「指定した順序で結果を取得」

 

以前から、「一回の (一つの) 検索式で、データベースからデータを「あるフィールドの値で指定した順序」で取り出す方法」がないかと気になっていた。

先日 MySQL のさまざまな BLOG を眺めていたら、FIELD 関数を用いれば実現できるとあった。改めて MySQL のマニュアルを見てみると、以下のような記述があった。

 

  • FIELD(str, str1, str2, str3, ... )

    str1str2str3... リストの str の開始位置 ( ポジション ) を戻します。str が見つからない場合は、0 を戻します。

 

例えば、、ORDER 句を "... ORDER BY FIELD(Model.id, 1, 10, 3, 2) ASC" のように指定すれば、FIELD 関数は Model.id が 1 の時には 1, 10 の時は 2、3 の時は 3、2 の時は 4 を返すので、ASC 指定により指定した「1 ⇒ 10 ⇒ 3 ⇒ 2」の順にレコードが取得される。

なお、指定した並び「1, 10, 3, 2」のいずれにもマッチしない場合は FIELD 関数は 0 を返すので、ORDER 句のほか条件式に Model.id IN (1, 10, 3, 2) を追加して絞り込んでおく必要がある。(これを忘れると、並びを指定した id 以外の全てのレコードが結果の先頭 (ASC の場合) または末尾 (DESC の場合) に付加されてしまうので注意)

CakePHP でもこの機能は利用でき、以下のように記述できる。

	$my_list = array(1, 10, 3, 2);
	$data = $this->Model->find('all', array(
		'conditions' => array('Model.id' => $my_list),
		'order' => array('FIELD(Model.id,' . implode(', ', $my_list) . ') ASC');
	));

なお、FIELD 関数の引数 str1, str2, ... はデータ型に応じて「整数比較」「文字列比較」「浮動小数点数比較」になるので注意。

関連タグ: MySQL  CakePHP 

関連エントリー