MySql报错only_full_group_by的解决办法

fyh 2022年03月16日 50次浏览

MySql在低版本(5.7.x以下)中允许select后面的非聚合列不出现在group by中。以下sql在低版本中是可以运行的,但是在5.7及以上版本会报错

SELECT DISTINCT `problem_id` FROM `solution` WHERE `user_id` = '2019212212277' AND `result` = 4 ORDER BY `judgetime` DESC LIMIT 25

报错:Expression #1 of ORDER BY clause is not in SELECT list,references column 'xxxxxxx'

MySql从5.7版本开始默认开启only_full_group_by规则,规则核心原则如下,没有遵循原则的sql会被认为是不合法的sql

  • order by后面的列必须是在select后面存在的
  • select、having或order by后面存在的非聚合列必须全部在group by中存在

可以通过三种方式解决报错问题

  • 第一种,修改sql使其遵守only_full_group_by规则
  • 第二种,将MySql的版本降到5.7以下
  • 第三种,关闭only_full_group_by规则

第三种方式如下:
查看 sql_model

show variables like '%sql_mode%'

暂时修改 sql_mode (重启失效)

set global sql_mode ='STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_ENGINE_SUBSTITUTION'

在 my.ini 或 my.cnf 文件里, [mysqld]下面追加一行

sql_mode=STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_ENGINE_SUBSTITUTION

docker中查看配置文件位置

mysql --help | grep my.cnf 

我们可以先找第一个文件,cat /etc/mysql/my.cnf 发现/etc/mysql/my.cnf 的文件末尾有这么两行 ,就是mysql目前使用的配置路径
!includedir /etc/mysql/conf.d/
!includedir /etc/mysql/mysql.conf.d/
我们到这里,不难发现这个/etc/mysql/conf.d/ 就是我们docker run 的时候隐射到内部的文件。所以这个时候,修改下我们-v映射到内部的这个cnf文件