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
一、问题描述
有以下数据表:
id t_id name score 1 1 张三 123 2 1 张三 324 3 2 李四 123 4 3 王五 323 5 4 李四 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 不兼容,”,那说明有兼容的设置呀,一番百度,找到了一下解决方法:
打开MySQL的配置文件,Windows为安装路径下my.ini文件,linux默认为/etc/my.cnf
在其中加入一行配置:
sql_mode=STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION
保存退出,重启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;