SELECT list is not in GROUP BY clause and contains nonaggregated column

SELECT list is not in GROUP BY clause and contains nonaggregated column

问题

在单独部署项目的时候遇到了这个问题,具体意思就是:
SELECT列表不在GROUP BY子句中,且包含非聚合列
意思应该就是SELECT的属性必须出现在GROUP BY语句中,即类似于SELECT a.name FROM user a GROUP BY a.name这种样子。
问题根源应该是sql语句的问题,但之前开发的过程中没有遇到过这样的问题。
于是网上查了一下,MySQL版本5.7.5及以上功能依赖检测功能,会默认开启ONLY_FULL_GROUP_BY SQL模式,也就是导致这个报错的原因,截图如下,具体可自行阅读参考手册,参考网址: MySql5.7参考手册.
在这里插入图片描述

解决方案

单次解决

连接数据库,查看当前的sql_mode

SELECT @@sql_mode;
or
SELECT @@GLOBAL.sql_mode;
or
show variables like 'sql_mode';

如果没有特意设置过的话,一般都会得到如下结果

ONLY_FULL_GROUP_BY,STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,
ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION

那么只要去除ONLY_FULL_GROUP_BY这个模式就可以了

SET sql_mode = 'STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,
ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION';

但这种方式修改也就这一次生效

修改配置文件

Windows系统在MySQL的安装目录下,与bin目录同级下的的my.ini文件。
Linux系统修改my.cnf文件。
[mysqld]下面添加这段

sql_mode = 'STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,
ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION'

使用规范的sql语句

还是参考了文档,使用ANY_VALUE函数
链接: MySql5.7——ANY_VALUE函数.
在这里插入图片描述

  • 3
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: 这个错误是由于SQL查询语句中的选择列表包含了未被分组且未聚合的列,而且在GROUP BY子句中没有包含该列所导致的。 简单来说,当你在SQL查询中使用了GROUP BY子句时,选择列表中只能包含被分组的列或者使用了聚合函数(例如SUM,COUNT等)的列。如果你选择列表中包含了未被分组且未聚合的列,那么就会出现这个错误。 要解决这个问题,你需要将选择列表中未被分组且未聚合的列从列表中删除,或者将这些列也加入到GROUP BY子句中,以便让查询语句能够正确地运行。 ### 回答2: 在MySQL中,当我们执行一个SELECT语句时,在GROUP BY子句中同时使用了聚合和非聚合列时,会出现“select list is not in group by clause and contains nonaggregated column”的错误。 这是因为在GROUP BY子句中使用聚合函数时,MySQL会将结果集按照指定的列进行分组。如果我们使用了非聚合列,MySQL就无法确定这些列的值是何意义下的结果,因为这些列的值在每一组中可能是不同的。因此,我们需要在GROUP BY子句中将所有的非聚合列都列出来,以便MySQL能够正确的计算。否则,MySQL就会认为我们在使用了无效的SQL语句。 解决这个问题有两种方法: 第一种是可以将所有的非聚合列都列出来,在GROUP BY子句中进行分组。例如: SELECT column1, column2, SUM(column3) FROM table_name GROUP BY column1,column2; 这个语句中,我们将所有的列都列出来,并在GROUP BY子句中指定了需要按照column1和column2进行分组的结果集。这样MySQL就能够正确计算了。 第二种方法是使用MySQL的扩展功能——ONLY_FULL_GROUP_BY模式。当我们开启ONLY_FULL_GROUP_BY模式时,MySQL会在使用GROUP BY子句时进行强制性检查,如果存在非聚合列而没有在GROUP BY子句中列出来,则会报错。开启ONLY_FULL_GROUP_BY模式可以防止我们在GROUP BY子句中出现这种错误。可以通过以下语句开启这个模式: SET sql_mode=ONLY_FULL_GROUP_BY; 总的来说,我们在使用GROUP BY子句时需要遵循的规则就是将所有的非聚合列都列出来,在ONLY_FULL_GROUP_BY模式下强制性检查,避免出现“select list is not in group by clause and contains nonaggregated column”的错误。 ### 回答3: select list is not in group by clause and contains nonaggregated column 这个错误是由于 SQL 语句中既有 GROUP BY 子句,又有未被聚合的列,导致的。SQL 中 GROUP BY 子句用来对数据进行聚合,合并重复行,并返回唯一值,而未被聚合的列则既包含了不同值,还包含了重复值,导致了错误的产生。 例如,下面的 SQL 语句会报错: SELECT department_name, SUM(salary) FROM employee GROUP BY department_name HAVING SUM(salary) > 10000 ORDER BY salary DESC; 这里的语句将员工表员工工资按照部门进行分组,并计算每个部门的薪资总和,然后对总薪资进行筛选,保留薪资大于 10000 的部门,并按降序排列。但是,这个 SQL 语句却有错误,因为 select list 中的 department_name 没有参与聚合函数,而在 GROUP BY 子句中也没有包含这个列。 为了解决错误,我们需要将 department_name 列添加到 GROUP BY 子句中,如下所示: SELECT department_name, SUM(salary) FROM employee GROUP BY department_name HAVING SUM(salary) > 10000 ORDER BY SUM(salary) DESC; 这里,我们将 department_name 添加到 GROUP BY 子句中,使 select list 中的列也被分组,同时将 ORDER BY 子句更改为按薪资总和进行排序。这样,就可以正确执行 SQL 语句了。 综上所述,产生 select list is not in group by clause and contains nonaggregated column 错误的主要原因是 GROUP BY 子句和未被聚合的列之间不匹配,需要保证 select list 中的列都参与到 GROUP BY 子句或聚合函数中,并且按需要调整 ORDER BY 子句的顺序。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值