MySQL报错“Expression #1 of SELECT list is not in GROUP BY clause and contains nonaggre”解决方法

背景

项目开发中,有个逻辑要用到group by,执行的时候,提示报错:

 Expression #1 of SELECT list is not in GROUP BY clause and contains nonaggregated 
 column 'novo_chatbot.web_users.id' which is not functionally dependent on columns in GROUP BY clause; 
 this is incompatible with sql_mode=only_full_group_by

在这里插入图片描述

字面意思就是:

SELECT列表的表达式#1不在GROUP BY子句中,并且包含非聚合列“novo_chatbot.web_users.id”,
该列在功能上不依赖于GROUP BY子句的列;
这与sqlmode=only_full_group_by不兼容

解决

一百度一个准,查看官方文档,也发现从 MySQL 5.7.5 开始,默认 SQL 模式包括 ONLY_FULL_GROUP_BY。 (在 5.7.5 之前,MySQL 不检测函数依赖,并且默认不启用 ONLY_FULL_GROUP_BY。)这可能会导致一些sql语句失效。

直接解决吧,我本地用的homestead,先根据文档说的查看一下本地的数据库的配置,进入数据库,输入命令

 show variables like 'sql_mode';

MySQL报错“Expression #1 of SELECT list is not in GROUP BY clause and contains nonaggre”解决方法_第1张图片
确实sql_mode=ONLY_FULL_GROUP_BY。这时候要么修改这个配置,要么就是把mysq版本降下来,果断选择改配置;

找到homestead中mysql的配置文件,并修改:

进入配置文件所在目录
/etc/mysql/mysql.conf.d/ mysqld.cnf
(备注:一般mysql的配置是在vim /etc/mysql/conf.d/mysql.cnf,homestead有自己的路径)

若是有sql_mode配置项直接将ONLY_FULL_GROUP_BY去掉。但我并未找到sql_mode的配置,那我就直接在配置文件里,加上这个配置试试吧

sql_mode= STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_ENGINE_SUBSTITUTION

保存之后,执行命令service mysql restart重启mysql即可
在这里插入图片描述
为了确保配置生效,我再查看一下,生效了:
MySQL报错“Expression #1 of SELECT list is not in GROUP BY clause and contains nonaggre”解决方法_第2张图片

然后我再使用group by 就正常了,大功告成,又活了一天

你可能感兴趣的:(Homestead,MySQL基础知识,常见问题,mysql,数据库)