在安装了MySQL5.7后,笔者发现,以前系统的一些sql语句报错了,报的错如下:
bad SQL grammar []; nested exception is com.mysql.jdbc.exceptions.jdbc4.MySQLSyntaxErrorException: Expression #1 of SELECT list is not in GROUP BY clause and contains nonaggregated column 'ws2.id' which is not functionally dependent on columns in GROUP BY clause; this is incompatible with sql_mode=only_full_group_by
意思就是说,当前的sql语句中,有一些是和only_full_group_by 的sql_mode不兼容的。
这个错误的意思是说,分组后,一些分组有多条记录,不知道一个分组该显示哪一个值。
我们先来看一看有这样的一个表。
表的字段很简单。
order_id(订单id),order_type_id(订单类型id),store_name(店铺名称)
数据是这样的
BN20150930233929591 999 地下室坡道照明系统改造
BN20150702170226129 101 世博会议中心
BN201512271300122162 101 暂无
我们这么写sql
select store_name from `order` group by order_type_id ;
就会报刚才那个错.
原因是这样子的。以订单类型分组。发现订单类型id为101的那一组有两个数据,也就是两个店名 世博会议中心和暂无。
数据库不知道分组后该显示哪一个,所以就报错了。
知道原因找解决的方法就很容易了。
我们使用一个any_value()函数。
意思是说,分组里的哪个数据都行。
select any_value(store_name) from `order` group by order_type_id ;
还有一个就是在配置文件中my.cnf关闭sql_mode=ONLY_FULL_GROUP_BY。
这样就解决了问题。