一,问题现象
在mysql中,用group by 分组时 报错 Expression #2 of SELECT list is not in GROUP BY clause and contains nonaggre,运行的sql
select a.id, a.name, a.age
from a
group by id, name
这个主要是违背了mysql开启的校验 only_full_group_by 检测
二,问题的本质
这个问题主要是mysql 开启了only_full_group_by ,同时,select 语句不够标准。only_full_group_by 说白了就是要求,select 的列要全部来自于group by 中的列,不能select 之外的列。 这个主要是mysql版本,5.7之前是默认关闭的,5.7之后的高版本都是自动打开only_full_group_by 校验检测的。
三,解决问题
1. 关闭only_full_group_by 检测(这个最粗暴,最简单,但是要重启mysql服务)
2. 修改sql语句,比如
select a1.*, a.age
from a left join
(select a.id, a.name
from a
group by a.id, a.name) a1 on a1.id = a.id
即,将分组后的结果和主表再次拼接一下就好了。
3. any_value() 函数,这个就是用来解决only_full_group_by 问题的。即,将多出来的字段使用这个函数就好了。
具体用那种方法按实际情况选择。
当MySQL在5.7及以上版本中运行分组查询时,如果SELECT列表中包含未在GROUP BY子句中指定的非聚合列,会触发'Expression #2 of SELECT list is not in GROUP BY clause and contains nonaggregated column'错误。该问题源于ONLY_FULL_GROUP_BY检查的启用。解决方法包括:关闭ONLY_FULL_GROUP_BY、修改SQL语句以符合标准,或者使用ANY_VALUE()函数。关闭检查需要重启服务,而修改SQL可以通过子查询或聚合函数来实现。


被折叠的 条评论
为什么被折叠?



