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