
Cakephp4: SQL扱い時に遭遇したエラー
error
SQLSTATE[42000]: Syntax error or access violation: 1140 In aggregated query without GROUP BY, expression #1 of SELECT list contains nonaggregated column 'database_name.table.columns'; this is incompatible with sql_mode=only_full_group_by
調べてみると、どうやら Mysql5.7 から ONLY_FULL_GROUP_BY がデフォルトでONになっている模様。
例えば GROUP BY に指定がないカラムを SELECT のフィールド指定するとエラーとなります。
SELECT name, tel, MAX(created) FROM hoges GROUP BY name;
この例の場合は tel のカラムが GROUP BY に指定がないのでエラーとなる。
対策としては、sql_mode() を変更するか、ANY_VALUE() を使用して非集計カラムを参照することが考えられます。
今回の自分の場合は Cake2 からの移行で今後たくさんの SQL を移行する可能性が高いし、その中で同じケースと遭遇すると予想されるので sql_mode を変更する作戦に。
対策をケースにより選択すると良いと思います。
Cakephp4: sql_modeを変更する
config/app.php
// Datasourceの内容は環境による
'Datasources' => [
'default' => [
'className' => Connection::class,
'driver' => Mysql::class,
'init' => ["SET sql_mode = 'ONLY_FULL_GROUP_BY, 略"], // ONLY_FULL_GROUP_BYを削除すればよろし。
],
とすることで非集計のカラムも選択できるようになりました。
■ MySQL での GROUP BY の処理
https://dev.mysql.com/doc/refman/8.0/ja/group-by-handling.html