LaravelでGROUP BY clause and contains nonaggregated columnと出たとき
問題のSQL
<?php $photos = Photo:: join ~省略~ ->select('photos.*') ->groupBy('photos.id')
と、した時に
GROUP BY clause and contains nonaggregated column
は出現しました。
原因
これはMySQL5.7からONLY_FULL_GROUP_BYがデフォルトで有効になっているためです。
qiita.com
元記事より引用
GROUP BYを使っていると、非集約カラムをSELECTで参照できなくなります。
つまりGROUP BY使っている場合はSELECTするものを全部GROUP BYに書け、とのことです。
そこで、/etc/my.cnfを編集していきたいところですが、
エラーが消えないなどハマってしまったためメモします。
解決
[mysqld]直下にsql_modeを書く!(重要)
手順
my.cnfの場所を探します
sudo find / -type f -ls | fgrep my.cnf 4 -rw-r--r-- 1 root root 1352 Jun 26 20:18 /etc/my.cnf
と出たので、/etc/my.cnfにありますね!
sudo vi /etc/my.cnf
[mysqld] sql_mode = STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_ENGINE_SUBSTITUTION # # Remove leading # and set to the amount of RAM for the most important data
my.cnfの一番下に書いてもなぜか反映されなかった。
保存して、mysqlサーバーを再起動する。
sudo systemctl restart mysqld
mysqlコンソールにて、ONLY_FULL_GROUP_BYが消えていることを確認します。
mysql> SELECT @@global.sql_mode; +----------------------------------------------------------------------------------------------------+ | @@global.sql_mode | +----------------------------------------------------------------------------------------------------+ | STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_ENGINE_SUBSTITUTION | +----------------------------------------------------------------------------------------------------+ 1 row in set (0.00 sec)
ONLY_FULL_GROUP_BYが消えていますので、WEBサイトにアクセスします。
すると、エラーGROUP BY clause and contains nonaggregated columnが消えました。