在开发时,遇到mysql版本在5.7.5及以上版本时使用group by 语句会报以下的错误
这是因为mysql 5.7.5版本以上默认的sql配置是:sql_mode=“ONLY_FULL_GROUP_BY”,这个配置严格执行了"SQL92标准"。
解决方法:
方法一:
查询数据库版本
查询报错中所提及的sql_mode
发觉全局中的sql_mode有这个ONLY_FULL_GROUP_BY的配置,我们尝试把这个配置删除
set @@GLOBAL.sql_mode = 'STRICT_TRANS_TABLES,NO_ENGINE_SUBSTITUTION';
再次查询分组发现还是会报一样的错误,原因是GLOBAL属性只针对新增的数据库,但是已经创建好的数据库依旧会使用旧配置,所以要使当前的数据库生效需要用以下的语句
set sql_mode = 'STRICT_TRANS_TABLES,NO_ENGINE_SUBSTITUTION';
执行完后我们再次查询发现已经可以正常group by 语句进行查询了
方法二:
例外情况:倘若在开发时,我们的mysql账号权限不给我们修改该配置的权限时,还可以使用ANY_VALUE()方法,它主要的作用就是抑制ONLY_FULL_GROUP_BY值被拒绝。
select ANY_VALUE(id),ANY_VALUE(categorie),type from abc GROUP BY type;
方法三:
通过配置文件修改sql_mode属性:
linux系统中:
文件地址一般在:/etc/my.cnf,/etc/mysql/my.cnf
使用vim命令编辑文件,去掉sql_mode中ONLY_FULL_GROUP_BY即可
有的my.cnf没有sql_mode这项配置就自行添加这行配置上去:
sql_mode = STRICT_TRANS_TABLES,NO_ENGINE_SUBSTITUTION
添加完后需重启数据库
window系统中:
找到mysql的安装目录中的my.ini文件对其进行修改
之后重启mysql服务即可。