如何解决mysql数据库[Err] 1055 .....this is incompatible with sql_mode=only_full_group_by;的问题

这是mysql 的报错

[Err] 1055 - Expression #22 of SELECT list is not in GROUP BY clause and contains nonaggregated column ‘Test.d.id’ which is not functionally dependent on columns in GROUP BY clause; this is incompatible with sql_mode=only_full_group_by

这里是查询语句
Vendor与Door是一对多的关系

SELECT * FROM
Vendor v
 JOIN Door d ON v.id=d.vendorId
GROUP BY v.id

是不是感觉没问题,其实出这个错是MySQL 5.7以后的版本的兼容问题,改掉一个配置参数就可以了,但是有的上线的项目有没有大神指导,不敢改配置呀。于是只能深究其原因。其实原因很简单,知道原因后,觉得mysql这样设计很合理。
原因如下:
当我把 SELECT * FROM 改为 SELECT v.* FROM 就不会出这问题了,其实想一想,每查一行v,就会对应多行d,然后分组后查出来的d也应该是一行,这里的d却是多行,那么数据库应该选择哪一行d呢,数据库懵逼了,这是一个逻辑错误啊,所以我们要把d也做一下处理,比如

SELECT v.*,max(d.abc) FROM
Vendor v
 JOIN Door d ON v.id=d.vendorId
GROUP BY v.id
	```
当然这里要确定在业务逻辑上面 一个v对应的多个d 每个d.abc 都是相等,min也可以处理

总结

mysql 使用group by 的时候 查询的多个表的结果一定要是类似一对一的。

有的同僚没有使用group by 也出现同样的sql_mode=only_full_group_by的问题,那么一定是查询后有多张表关联,其中一张表用来count,max,min之类的函数,而其他表没有,这样就类似一对多了,我们要变成一对一

比如查了A表和B表,A表用了group by 或者count,max,min之类的函数,A表就肯定只有一行数据,B却可能有多行数据,数据库就懵逼了,B表选择哪一行呢,(以前的老版本的数据库默认选择第一行数据,所以老版本的数据库不会出现这个错误),在你的业务逻辑中,B表的某一个字段肯定是相等的,不然你不会这么查,所以把B表的这个字段加上max或者min就不会报错了

网上其他文章都是改数据库配置,其实这个东西是合理,不需要改配置,反而你改了配置以后,你的业务逻辑还有可能出错的风险

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值