SQl语句group by分组异常

执行SQl报错:Expression #2 of SELECT list is not in GROUP BY clause and contains nonaggregated column ’test.t1.name’ which is not functionally dependent on columns in GROUP BY clause; this is incompatible with sql_mode=only_full_group_by

一、问题描述

  • 有以下数据表:

    • idt_idnamescore
      11张三123
      21张三324
      32李四123
      43王五323
      54李四666
  • 执行sql(sql和数据表没有任何实际意义,就是为了引出问题,莫较真):

    • SELECT t_id, `name`, COUNT(*) count FROM t1 GROUP BY t_id ORDER BY count DESC;
      
  • 报错:

    • Expression #2 of SELECT list is not in GROUP BY clause and contains nonaggregated column ’test.t1.name’ which is not functionally dependent on columns in GROUP BY clause; this is incompatible with sql_mode=only_full_group_by

    • 我们来分析下这个报错:说是name字段在功能上不依赖于组Group BY子句中的列,这与 sql _ mode = only _ full _ group _ by 不兼容,说人话讲就是name不在分组字段中,也就是说Group BY后面不包含name,但是select后面却有

二、解决

方法一:修改配置文件

既然错误中提到“这与 sql _ mode = only _ full _ group _ by 不兼容,”,那说明有兼容的设置呀,一番百度,找到了一下解决方法:

  1. 打开MySQL的配置文件,Windows为安装路径下my.ini文件,linux默认为/etc/my.cnf

  2. 在其中加入一行配置:

    sql_mode=STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION
    
  3. 保存退出,重启MySQL即可

注: 此方法兼容性不高,毕竟only _ full _ group _ by是MySQL的默认配置,我就是因为测试服务器没毛病,但上到正式服务却踩了坑,一看配置文件才发现测试服的配置是他们以前改过的,而正式服MySQL刚装的,用的默认配置,所以就出问题了…

方法二(推荐):优化sql

GROUP BY可以添加多个字段,在第一个字段分组的基础上在进行第二个字段的分组,既然说 name不在分组字段中,那就给他加入到字段中(根据自己的场景,按需修改)

select t_id, `name`, COUNT(*) count FROM t1 GROUP BY t_id, `name` ORDER BY count DESC;