mysql 5.7版本从sql本质上解决ONLY_FULL_GROUP_BY问题


参考下面两个帖子的内容:
mysql报错ONLY_FULL_GROUP_BY解决(修改sql_mode)
真正有效解决ONLY_FULL_GROUP_BY的问题

执行的sql
select  t1.cloumn1 , t1,cloumn2
from table t1
group by t1.cloumn1
执行后的报错信息
Expression #2 of SELECT list is not in GROUP BY clause and contains nonaggregated 
column 'table.field' which is not functionally dependent on columns in GROUP BY clause;
this is incompatible with sql_mode=only_full_group_by
第一种方案:
修改sql_mode,不考虑 ,通过搜索引擎检索到的解决方案也基本都是这种操作,
实际上大多数生产环境也并不允许你随便修改sql_mode来解决这个问题。
第二种方案:
修改sql,让sql达到sql_mode要求,不出现报错信息。

修改之前我们得知道为啥会出现这个问题。

错误原因

在mysql5.7.5的版本之前是默认不打开ONLY_FULL_GROUP_BY这个sql_mode的,也就是说出现这个问题通常只会存在于5.7.5+的版本上。

mysql官方给的ONLY_FULL_GROUP_BY解释:

简单说就是:如果在SELECT中的列既没有在GROUP_BY中出现,本身也不是聚合列(使用SUMANG等修饰的列),
那么这句SQL是不合法的,因为那一列是不确定的。
解决方案

知道为啥了,解决方案自然也就出来了:让select中的字段和group by里面的字段保持一致。
实际操作中一个错误sql:

SELECT
	u.NAME,
	up.PASSWORD 
FROM
	user u
	LEFT JOIN user_password up ON u.id = up.user_id 
	GROUP by u.NAME

修改后的正确sql:

SELECT
	u.NAME,
	up.PASSWORD 
FROM
	user u
	LEFT JOIN user_password up ON u.id = up.user_id 
	GROUP by u.NAME,up.PASSWORD 

最后提供一种项目中解决这个问题的思路:

通常我们项目中做分组查询的时候,需要拆分为两部分,
第一部分:只查分组字段的信息(需要包含id),
第二部分:通过分组查询出来的id,再查询具体的单条记录数据。
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 3
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值