私の愛しいアップルパイへ
ある日、愛犬のマリーと戯れるようにCakePHPを華麗に操っていると、CakePHPから釣れない返事が帰ってきました。SQLの実行が失敗したというのです。
テスト環境ではうまくいっていたのにそんなはずはないと思いましたが、原因はGROUP BY句にありました。あなたにはこんなことに時間を使ってほしくないので、原因と対策を解説します。
MySQLでGROUP BY句を使ったSQL文がエラーになる原因と対応
MySQL 5.6から5.7にバージョンアップしたタイミングで、MySQL のONLY_FULL_GROUP_BYオプションがデフォルとでONになるようになりました。私の場合は開発環境がMySQL5.6で、本番環境が5.7だったので開発環境をすり抜けて本番環境だけでエラーが出てしまったわけですね。
このオプションはなにかというと、GROUP BY句を使った場合にはきちんとGROUP化されたカラムか、SUMやAVGで集約されたカラムだけを明示的に指定しなさいというオプションです。確かに、GROUP BY句が指定されているのに取得するカラムにユニークキーなどが含まれていると、SQL文的には気持ち悪いですよね。
この規定に反すると、ログに以下のようなエラーが出力され、SQL文の実行に失敗します。
ERROR 1055 (42000): Expression #1 of SELECT list is not in GROUP BY clause and contains nonaggregated column 'db_name.table_name.id' which is not functionally dependent on columns in GROUP BY clause; this is incompatible with sql_mode=only_full_group_by
対策は簡単で、エラー内容の通り必要なカラムだけをSELECTするようにすればOKです。
CakePHPではなにもカラムを指定しないとすべてのカラムをSELECTしようとするため、GROUB BY句を使うとこのエラーに引っかかることになります。GROUP BY句を使う時は必要なカラムだけを明示的に指定しましょう。これでエラーは解決です。
貴下の従順なる下僕 松崎より