人力検索はてな
モバイル版を表示しています。PC版はこちら
i-mobile

CakePHPでサブクエリを使って結合し、findで出力する方法を教えてください。

■テーブル構成(テーブル名:フィールド)
users:id,name
orders:id,user_id

■SQL文で書く場合
SELECT users.id,users.name,order_num FROM `users` LEFT JOIN
(SELECT COUNT(user_id) AS order_num,user_id FROM `order` GROUP BY user_id) AS order_tb
ON users.id=order_tb.user_id

CakePHPは1.3.2を使っています。情報が足りない場合はコメントにて指摘してください。


●質問者: k27w
●カテゴリ:ウェブ制作
✍キーワード:as CakePHP GROUP name ON
○ 状態 :終了
└ 回答数 : 1/1件

▽最新の回答へ

1 ● tdoi
●100ポイント ベストアンサー

コメントに書いたようなbuidStatementを使って、次のURLのようなLEFT JOINの方法を参考にすると、次のように書けます。

 $dbo = $this->User->getDataSource();
 $subQuery = $dbo->buildStatement(array('fields' => array("user_id", "COUNT(id) AS order_num"),
 'table' => $dbo->fullTableName($this->Order),
 'alias' => 'Order',
 'limit' => null,
 'offset' => null,
 'joins' => array(),
 'conditions' => array(),
 'order' => null,
 'group' => "user_id"),
 $this->Order);
 $options = array();
 $options['conditions'] = array();
 $options['fields'] = array("User.id", "User.name", "order_tb.order_num");
 $options['joins'] = array();
 $options['joins'][] = array("type" => 'LEFT',
 "alias" => 'order_tb',
 "table" => "({$subQuery})",
 "conditions" => 'User.id = order_tb.user_id');
 $this->User->find('all', $options);

この結果

SELECT `User`.`id`, `User`.`name`, `order_tb`.`order_num` FROM `users` AS `User` LEFT JOIN (SELECT user_id, COUNT(id) AS order_num FROM `orders` AS `Order` WHERE 1 = 1 GROUP BY user_id ) AS `order_tb` ON (`User`.`id` = `order_tb`.`user_id`) WHERE 1 = 1 

というクエリが実行されます。

◎質問者からの返答

ありがとうございます。求める結果が得られました。

関連質問


●質問をもっと探す●



0.人力検索はてなトップ
8.このページを友達に紹介
9.このページの先頭へ
対応機種一覧
お問い合わせ
ヘルプ/お知らせ
ログイン
無料ユーザー登録
はてなトップ