テーブル内のカラムの数をカウントしたい時がある。
僕にもある。
あなたにもある。
エラーと戦い過ぎて、頭がおかしくなってきました(笑)
Cakephp4でGroup byを使ったcountをしようと思って、Cakephp2.xの時を思い出しならがやっていると、
下記エラーから数時間抜け出せなかった。
SQLSTATE[42000]: Syntax error or access violation: 1055 Expression #1 of SELECT list is not in GROUP BY clause and contains nonaggregated column 'my_app.clicks.id' which is not functionally dependent on columns in GROUP BY clause; this is incompatible with sql_mode=only_full_group_by
✗間違っているソース
1 2 3 4 5 6 7 8 9 |
$clicksTable = $this->getTableLocator()->get('clicks'); $click_data = $clicksTable->find(); $click_data->select(['id','hoge_id','count'=>$click_data->func()->count('*')]) ->group('hoge_id') foreach ($click_data as $row) { debug($row); } |
これでいけると思いますよね??
Cakephp2.xの方々
ダメなんです!!
MySQL 5.7からGROUP BY句によけいなカラムは入れてはダメなんです!!
なので、
○あっているソース
1 2 3 4 5 6 7 8 9 |
$clicksTable = $this->getTableLocator()->get('clicks'); $click_data = $clicksTable->find(); $click_data->select(['hoge_id','count'=>$click_data->func()->count('id')]) ->group('hoge_id'); foreach ($click_data as $row) { debug($row); } |
おわかりいただけます??
クエリビルダーのselectのところに`id`って入れたらダメなんです!!
CakephpからではなくMySQLから怒られます。
これだけのために何時間も戦っています!!