报错示例如下:
SELECT列表的表达式#2不在GROUP BY子句中,并且包含非
聚集列'sss.month_id',它在功能
上不依赖于GROUP BY子句中的列; 这与
sql_mode = only_full_group_by 不兼容
问题出现的原因
MySQL 5.7.5及以上功能依赖检测功能。如果启用了ONLY_FULL_GROUP_BY,MySQL将拒绝选择列表,HAVING条件或ORDER BY列表的查询引用在GROUP BY子句中既未命名的非集合列,也不在功能上依赖于它们。(5.7.5之前,MySQL的没有检测到功能依赖关系,默认情况下不启用ONLY_FULL_GROUP_BY。有关5.7.5之前的行为的说明,请参见”的MySQL 5.6参考手册”)。
这个问题有两种解决方案:
0.1. 通过SQL语句更改global.sql_mode设置
通过SQL语句select @@ global.sql_mode;
查询,
得到如下类似如下格式的结果:
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
,重新设置值:
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';
0.2. 修改mysql.cnf文件
以ITERM打开mysql.cnf文件:sudo vim /etc/mysql/conf.d/mysql.cnf
滚动到文件底部复制并粘贴如下设置:
[mysqld]
sql_mode = STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION
到文件的底部,保存并退出输入模式。
随后重启MySQL服务即可。
service mysqld restart