先来说一下:sql_mode=only_full_group_by这个报错
我们公司的一个项目在我部署的时候,出现了这样一个问题,就是上面这个报错,他的原因也非常简单,我们在开发的时候mysql是5.5版本,线上是5.7版本,而5.7以及8的版本都具有设置ONLY_FULL_GROUP_BY时,对有GROUP BY子句SQL,SELECT的字段要么是GROUP BY中的字段,要么对字段进行聚合运算。
所以例如:
- select product_id,min(`year`),quantity,price from sales
- GROUP BY product_id
你这么写,除了前两个字段以外,quantity和price都会报这个问题,这个严格模式有的时候我们是要取消掉的,但是如果取消掉其实会有很多的问题,我们下面再讲,先来讲讲如何取消掉。
原理很简单,找到你mysql的ini文件(我是windows,Linux的可以去别的文章搜一搜,都有);
我的位置是:C:\ProgramData\MySQL\MySQL Server 5.7 (其实网上有很多找my.ini的方法一搜就是,我这里不多赘述了);
然后打开ini,里面你在mysqlid下面能找到;
把only_full_group_by删除即可,然后保存重启mysql服务,这个严格模式就关掉了。
现在已经关闭掉了严格模式,然后我们看一个问题,这个还是很久之前我做leetcode的时候碰到过的一个问题,我们先看数据。这是一张表,要求查相同product_id下第一年的销售情况 。
诶,有的老哥看到这就想,这也太简单了吧?直接根据product_id分组后select min(year)不就完事了吗?我们看SQL和结果:
是的,我当时也是非常的自信,三下五除二就写完了,发现不对!!! 为什么2007年的销售情况是10和5000?不应该是8和3000吗?
这就是取消了严格查询的后果,group by分组后,如果查询的字段不是分组或者聚合后的字段,他是会返回这个分组字段的第一条信息的,而第一条信息是2008年的10和5000,这就是group by的一个小坑。
所以才有了严格模式,对有GROUP BY子句SQL,SELECT的字段要么是GROUP BY中的字段,要么对字段进行聚合运算,这才不会有这样的问题,所以各位在写group by的时候一定要看仔细了。
然后说一下正确的答案: