MySQL_select列表的表达式#1不在GROUP BY子句中,并且包含nonaggre的问题的解决

2017年11月25日 99 字 教程整理


报错示例如下:

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