1、group by中的分组字段和select后的字段要保持一致;
2、通常group by和聚合函数一起使用,但也可以不包含聚合函数,根据业务需求决定;
3、常用的聚合函数有max()、min()、avg()、sum()、count()等。
这个错误发生在mysql 5.7.5 版本及以上版本会出现的问题:
mysql 5.7.5版本以上默认的sql配置是:sql_mode=“ONLY_FULL_GROUP_BY”,这个配置严格执行了"SQL92标准"。
很多从5.6升级到5.7时,为了语法兼容,大部分都会选择调整sql_mode,使其保持跟5.6一致,为了尽量兼容程序。
解决方案一:使用函数ANY_VALUE()包含报错字段
SELECT ANY_VALUE(ID),USER_ID,ANY_VALUE(problems),ANY_VALUE(last_updated_date) FROM t_iov_help_feedback GROUP BY USER_ID;
解决方案二:通过sql语句暂时性修改sql_mode
SET @@global.sql_mode ='STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_ENGINE_SUBSTITUTION';
上面是改变了全局sql_mode,对于新建的数据库有效。对于已存在的数据库,则需要在对应的数据库下执行:
SET sql_mode ='STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_ENGINE_SUBSTITUTION';
解决方案三:通过配置文件永久修改sql_mode
mysql安装在服务器上和安装在本地,修改配置文件的方式有点区别。
编辑my.***f文件
文件地址一般在:/etc/my.***f,/etc/mysql/my.***f
找到sql-mode的位置,去掉ONLY_FULL_GROUP_BY
然后重启MySQL;service mysql restart
有的my.***f中可能没有sql-mode,需要追加:
sql-mode=STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION
注意要加入到[mysqld]下面,如加入到其他地方,重启后也不生效
对于docker 下安装的mysql, 重启容器,数据会丢失的 。
最常见的数据持久化方式是使用Docker数据卷或者将主机的文件夹挂载到容器中。这样,即使容器被终止或重启,卷中的数据与挂载的文件夹中的数据会保持不变,确保数据的持久化。