MySQL 5.7以后,默认开启了only_full_group_by规则,规则的核心原则如下:
- order by后面的列必须是在select后面存在的
- select、having或order by后面存在的非聚合列必须全部在group by中存在
现在使用的MySQL 8.0全有这个问题,这个问题有三个解决办法:
- 修改sql语句,使其遵守only_full_group_by规则
- 将MySQL版本降低到5.7以下
- 关闭only_full_group_by规则
第一种修改起来麻烦,而且,有时候,会无法满足需求;
第二种降低版本,肯定是不行的
这里介绍第三种:
下以两行用来查询是否有only_full_group_by规则
SELECT @@GLOBAL.sql_mode;
SELECT @@SESSION.sql_mode;
这是返回结果
ONLY_FULL_GROUP_BY,STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,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_ENGINE_SUBSTITUTION';
set @@SESSION.sql_mode='STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_ENGINE_SUBSTITUTION';
然后,需要重启数据库
service mysqld stop;
service mysqld start;
自己测试中发现,重启以后,这个mode会复原,反复操作了几次才有效