DEVELOPERS BLOGデベロッパーズブログ
以前から、「一回の (一つの) 検索式で、データベースからデータを「あるフィールドの値で指定した順序」で取り出す方法」がないかと気になっていた。
先日 MySQL のさまざまな BLOG を眺めていたら、FIELD 関数を用いれば実現できるとあった。改めて MySQL のマニュアルを見てみると、以下のような記述があった。
-
FIELD(str, str1, str2, str3, ... )
str1
、str2
、str3
、...
リストの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, ... はデータ型に応じて「整数比較」「文字列比較」「浮動小数点数比較」になるので注意。
この記事は加藤 正人さんが書いています!
- 氏名
- 加藤 正人
- 役職
- 多分SE
- 血液型
- 秘密
- 出没
- 美味しいもののあるところ
- 特色
- タヒチ大好き。ちょいメタボ。
- 2020/12/15
- CakePHP3 のリダイレクトがうまく行かない例
- 2020/11/12
- Apache Bench
- 2020/10/05
- PhpSpreadsheet でExcel ファイルを読み込む (CakePHP3)
2020/12/15
2020/11/12
2020/10/05
2020/09/11
2020/08/03