• MySQL:关于group by的一个小坑,以及sql_mode=only_full_group_by问题


    先来说一下:sql_mode=only_full_group_by这个报错

            我们公司的一个项目在我部署的时候,出现了这样一个问题,就是上面这个报错,他的原因也非常简单,我们在开发的时候mysql是5.5版本,线上是5.7版本,而5.7以及8的版本都具有设置ONLY_FULL_GROUP_BY时,对有GROUP BY子句SQL,SELECT的字段要么是GROUP BY中的字段,要么对字段进行聚合运算。

    所以例如:

    1. select product_id,min(`year`),quantity,price from sales
    2. 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服务,这个严格模式就关掉了。 

     二、group by的一些小坑(很重要建议看一下)

    现在已经关闭掉了严格模式,然后我们看一个问题,这个还是很久之前我做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的时候一定要看仔细了。 

    然后说一下正确的答案:

  • 相关阅读:
    聊聊 HTTP 性能优化
    类型擦除和桥接方法
    解析xml文件
    angular项目指定端口,实现局域网内ip访问
    Android 调试桥——ADB
    5个精美的wordpress中文企业主题模板
    Python操作Numpy模块库
    Java 学习路线分享 maven 是什么?
    【无标题】
    vant 的 Cascader 级联选择 组建css样式错乱问题修复
  • 原文地址:https://blog.csdn.net/jialuosi/article/details/138178906