MySQLでGROUP BY句を使ったSQL文がエラーになる原因と対応

cakephp

私の愛しいアップルパイへ

ある日、愛犬のマリーと戯れるように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化されたカラムか、SUMAVGで集約されたカラムだけを明示的に指定しなさいというオプションです。確かに、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句を使う時は必要なカラムだけを明示的に指定しましょう。これでエラーは解決です。

貴下の従順なる下僕 松崎より

著者画像

システム系の専門学校を卒業後、システム屋として6年半の会社員生活を経て独立。ブログ「jMatsuzaki」を通して、小学生のころからの夢であった音楽家へ至るまでの全プロセスを公開することで、のっぴきならない現実を乗り越えて、諦めきれない夢に向かう生き方を伝えている。