こんな感じのSELECT文をクエリービルダーで作りたかった。
SELECT user_id,SUM(CASE WHEN flg = ‘1’ THEN 1 ELSE 0 END) cnt FROM hoge GROUP user_id
なので、以下のようにしました。
$query = $this->Hoge->find();
$hogeCase = $query->newExpr()
->addCase(
[$query->newExpr()->add(['flg' => '1'])],
[1,0],
['integer','integer']
);
$query->select([
"user_id" => "user_id",
"cnt" => $query->func()->sum($hogeCase)
])
->group("user_id");
ですが、上記にすると「関数sum(text)は存在しません」とエラーになってしまい、動きませんでした。
ログに出力された実行後のSELECT文は、pgAdminで実行することはできましたが、なぜかクエリービルダーでは上記のエラーになってしまいす。
CakePHP3のドキュメントを見たら、COUNT()を使って集計している例があったので、もしかしてこれならいけるのかと思い試してみました。
とりあえず、上記のコードを修正して、COUNT()で集計するようにしました。
$query = $this->Hoge->find();
$hogeCase = $query->newExpr()
->addCase(
$query->newExpr()->add(['flg' => '1']),
1,
'integer'
);
$query->select([
"user_id" => "user_id",
"cnt" => $query->func()->count($hogeCase)
])
->group("user_id");
これなら想定していたデータが取得できました。
COUNT()は、NULLのデータはカウントされないんですね。知らなかった。。。
いままでCOUNT()関数をなんとなく使っていたので、今回こういうことがあって、ちょっと勉強になったのでよかったのかなと思います。