java

关注公众号 jb51net

关闭
首页 > 软件编程 > java > mysql group_by报错

mysql高版本(8.0+)group_by报错的处理方法

作者:*郑*

本文主要介绍了mysql高版本(8.0+)group_by报错的处理方法,这个错误一般发生在mysql 5.7以及 5.7以上的版本中,本文就来介绍一下两种解决方法,感兴趣的可以了解一下

1. 原因

这个错误一般发生在mysql 5.7以及 5.7以上的版本中,其原因是mysql的默认配置中,sql_mode=“ONLY_FULL_GROUP_BY” 这个配置严格执行了 ‘SQL92标准’,查询字段没有在group by 字段后同时出现,那么sql语句就不合法,就会抛出错误

Expression #1 of SELECT list is not in GROUP BY clause and contains nonaggregated column 'xxx' which is not functionally dependent on columns in GROUP BY clause; this is incompatible with sql_mode=only_full_group_by

这是由于MySQL高版本默认启用了sql_mode的only_full_group_by模式,对于GROUP BY操作,要求SELECT语句中的字段必须出现在GROUP BY子句中或者使用聚合函数进行处理。否则就会报上述错误。

2. 处理方法

连接mysql库,执行一下语句,查看sql_mode

select @@GLOBAL.sql_mode;

2.1 临时方法,重启后失效

SET GLOBAL sql_mode='STRICT_TRANS_TABLES,NO_ENGINE_SUBSTITUTION';

2.2 修改配置my.ini文件

在[mysqld]下面添加以下代码

sql_mode=STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_ENGINE_SUBSTITUTION

3. 对查询结果中的字段应用聚合函数

若不能修改MySQL的配置文件,或者需要在特定场景使用原始的sql_mode值,我们也可以尝试在查询语句中对未出现在GROUP BY子句中的字段应用聚合函数来解决报错问题。

例如:

SELECT user_id, SUM(score) FROM scores GROUP BY user_id;

该语句会报错,因为SELECT语句中的score字段未出现在GROUP BY子句中。但是,我们可以尝试使用聚合函数:

SELECT user_id, MAX(score) FROM scores GROUP BY user_id;

该语句中的score字段被应用了MAX聚合函数,这样就符合了only_full_group_by模式的要求,不会报错。

示例

下面提供两个具体的示例来展示如何使用上述解决方案。假设我们有如下的scores数据表:

id   user_id   score
1    100      88
2    100      93
3    101      73
4    102      85
5    102      91

示例1:修改sql_mode参数值

我们可以通过如下步骤来修改MySQL的sql_mode参数:

打开MySQL的配置文件my.cnf或my.ini。

找到[mysqld]节点下的sql_mode参数(可能会有多个)。

将其值修改为:sql_mode=NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION。

保存文件并重启MySQL服务。

使用如下SQL查询语句,测试是否能正确查询出score字段的平均值:

SELECT AVG(score) FROM scores GROUP BY user_id;

示例2:使用聚合函数

在不修改MySQL的sql_mode参数的情况下,我们可以改变查询语句,使用聚合函数来解决only_full_group_by模式带来的限制。

例如,下列SQL语句查询出每个用户的最小成绩:

SELECT user_id, MIN(score) FROM scores GROUP BY user_id;

在这个查询语句中,score字段被应用了MIN聚合函数,符合only_full_group_by模式的要求。因此可以正常执行,并正确返回结果。

到此这篇关于mysql高版本(8.0+)group_by报错的处理方法的文章就介绍到这了,更多相关mysql group_by报错内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

您可能感兴趣的文章:
阅读全文