最近将 MySQL 版本升级到 5.7 之后,分组查询语句就出错了,在 Laravel 框架下,出现如下错误提示:

1
2
QLSTATE[42000]: Syntax error or access violation: 1055 Expression #2 of SELECT list is not in GROUP BY clause and contains nonaggregated column ''
which is not functionally dependent on columns in GROUP BY clause; this is incompatible with sql_mode=only_full_group_by

错误的简单理解:sql_model=only_full_group_by限制了查询的结果,可以通过官方MySQL 5.7手册,发现
ONLY_FULL_GROUP_BY的设定,将不允许查询字段包括非聚集列;使用 root 账号登录MySQL,执行 select @@GLOBAL.sql_mode;命令,可以看出:

1
2
ONLY_FULL_GROUP_BY,STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,
NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION

默认开启了ONLY_FULL_GROUP_BY选项,可以通过如下方法解决:

1.修改 mysql.cnf 配置文件

1.1 sudo vim /etc/mysql/conf.d/mysql.cnf,根据实际 MySQL 配置文件路径修改;
1.2 找到sql_mode的位置,改成:

1
2
sql_mode=STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,
NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION

1.3 保存修改,执行sudo service mysql restar命令重启 MySQL 服务。

2.每列增加聚合函数

通过对需要查找的列增加聚合函数,例如:MAX()MIN()等函数,即可解决;但以后的分组查询语言,都需要这样设置,才不会报错;这种方法并不适合后期的维护。

3.通过命令行修改配置

1
2
set global sql_mode='STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION';
set session sql_mode='STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION';

通过以上三种方法,即可解决问题。

最后更新: 2018年01月06日 16:43

原始链接: http://blog.minhow.com/2017/03/05/database/mysql57-error-solve/

× 请我吃糖~
打赏二维码