DISTINCT

Posted by muchag | CakePHP,困ったTT | 2011-06-29 (水) 23:03:22

DISTINCT の使い方が難しい・・・。

【環境】
[CakePHP] 1.3.10
[MySQL] 5.1.41
機能

DISTINCT キーワードはカラム内の重複データを1つにまとめてくれるもの。

  1. SELECET DISTINCT family_name FROM users

とすると、同じ苗字のユーザがまとめられる。

その後集計を必要とするなら GROUP BY 句を用いるべき。

詳細は解説サイト参照。
 

基本

CakePHP で DISTINCT を利用するには
find メソッドで第2引数に設定する $options の ‘fields’ に設定する。

  1. $options = array(
  2.     'fields' => array(
  3.         'DISTINCT User.family_name'
  4.     )
  5. );

 

注意点
大文字で記述

DISTINCT キーワード自体は 全て大文字 で記述する。

Distinct と小文字で記述すると

SQL Error: 1054: Unknown column ‘Distinct User.family_name’ in ‘field list’

というエラーメッセージが出た。

参考元サイト:cakephperの日記 cakeのSQLでDISTINCTを扱う
 

先頭に記述

マニュアルを見ると

  1. array(
  2.     /* snip */
  3.     'fields' => array('Model.field1', 'DISTINCT Model.field2'), //フィールド名の配列
  4.     /* snip */
  5. )

The CakePHP 1.3 Book:3.7.3.1 find
と書いてあるが
ちょびろぐ:findでDISTINCTを使う際に注意すること
に書いてあるように、DISTINCT を 先頭 に設定しないと

SQL Error: 1064: You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near ‘DISTINCT `User`.`family_name` FROM `users` AS `User`

というエラーメッセージが出る。
 

アソシエーション

DISTINCT を利用したいモデルにアソシエーションを設定しているときは
‘recursive’ = -1 を設定しないと重複をまとめてくれない。

具体的に試した内容は
User モデルに $hasMany プロパティを設定した状態ではNGだった。

‘recursive’ = -1 を設定したら希望通りに重複レコードをまとめてくれた。
 

複数カラムを取得できない

上述注意点を全てクリアしたものの、単一カラムは取得できても
複数カラムを設定するとエラーにはならなくても、まとめてくれない。

未解決。

CakePHP,困ったTT | 2011-06-29 (水) 23:03:22 |

コメントはまだありません »

No comments yet.

RSS feed for comments on this post. TrackBack URI

Leave a comment