MENU
DATE:2018/11/05

MySQL 5.7 ~ GROUP BY句でエラーが出た話

このエントリーをはてなブックマークに追加

こんにちは、
ちょっと前に自社サービスのサーバーをお引越しする機会がありまして
それに伴ってデータベースとして使っているMySQLのバージョンもver5.7へと変更されました。

そのときSQL文のGROUP BY句に少しつまづいたので原因と解決方法などまとめたいと思います。

こんなエラー文が出ました

#1055 - Expression #1 of SELECT list is not in GROUP BY clause and contains nonaggregated column 'テーブル名.users.id' which is not functionally dependent on columns in GROUP BY clause; this is incompatible with sql_mode=only_full_group_by

 

SQL文自体はとてもシンプルで、こんな感じです。

SELECT * from テーブル名 group by user_id

 

うーん、、、
今まで動いていたのになぜや、、、。

迷ったときは天下のGoogle様に素直に甘えるのが得策です!

なのでさっそく調べてみました。

原因はMySQLの設定にあり

「MySQL group by エラー」と調べると結構多くの人が同じ壁にぶつかっていました。

結論だけ言ってしまうと、
MySQL5.7以降のバージョンから[sql_mode]の設定に[only_full_group_by]が指定されていることにあるようです。

この[only_full_group_by]が、GROUP BYの仕様を少し厳しくしているらしいです。

解決方法は2択

解決方法その①:sql_modeの設定を変更する

このGROUP BY問題を解決する一つ目の方法は、sql_modeの値を変更することです。

sql_modeの変更方法を説明すると長くなってしまうので、
参考記事を掲載しておくにとどめます。(他力本願)
MySQL SQLモードの設定、確認について | kakiro-web カキローウェブ

ただ、sql_modeの変更を適用するにはMySQLを再起動する必要がありますので
ローカルサーバーや専用サーバーを使っている場合でないと対応できません。

レンタルサーバーの場合は残念ながら選択できない方法となります。

解決方法その②:郷に入らば郷に従え

というわけでレンタルサーバーの場合は、おとなしく[only_full_group_by]の仕様に従っておきましょう。

GROUP BY句を使うときは、group by で指定するカラムと抽出するカラムをきちんと合わせてあげることで正常に動作してくれます。

SELECT user_id from テーブル名 group by user_id

 

もしかすると別のアプローチがあるのかもしれません。
また時間があれば色々調べてみたいと思います。

この記事を書いた人

わたなべ

HTML5とCSS3とPHPとJavascriptとMySQLで開発をします。 フレームワークはLaravelを勉強中です。 地方の観光地として有名な洞窟に隣接するカフェが好きです。

この人の記事を見る
ブログ記事一覧へ戻る