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

 更新时间:2023年09月03日 16:21:29   作者:*郑*  
本文主要介绍了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报错内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • Java设计模式之原型模式的示例详解

    Java设计模式之原型模式的示例详解

    原型模式(Prototype Pattern)指使用原型实例指定创建对象的种类,并且通过拷贝这些原型创建新的对象。本文将通过案例详细讲解一下原型模式,感兴趣的可以了解一下
    2022-02-02
  • 如何利用Java获取当天的开始和结束时间

    如何利用Java获取当天的开始和结束时间

    这篇文章主要介绍了如何使用Java 8的LocalDate和LocalDateTime类获取指定日期的开始和结束时间,展示了如何通过这些类进行日期和时间的处理,从而简化了日期时间操作,需要的朋友可以参考下
    2025-02-02
  • Spring session整合到Redis过程解析

    Spring session整合到Redis过程解析

    这篇文章主要介绍了Spring session整合到Redis过程解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2019-11-11
  • Java windows环境构建图文教程

    Java windows环境构建图文教程

    这篇文章主要为大家介绍了Java windows环境构建图文教程,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪<BR>
    2023-12-12
  • Java中super和this的用法详解

    Java中super和this的用法详解

    这篇文章主要介绍了Java中super和this的用法详解,本文通过实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2020-08-08
  • SpringBoot实现数据库读写分离的3种方法小结

    SpringBoot实现数据库读写分离的3种方法小结

    为了提高系统的读写性能和可用性,读写分离是一种经典的数据库架构模式,在SpringBoot应用中,有多种方式可以实现数据库读写分离,本文将介绍三种主实现方案,大家可以根据需要自行选择
    2025-04-04
  • springboot相关面试题汇总详解

    springboot相关面试题汇总详解

    这篇文章主要介绍了springboot相关面试题汇总详解,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2019-08-08
  • Java如何使用poi生成简单word文档并导出

    Java如何使用poi生成简单word文档并导出

    这篇文章主要介绍了Java如何使用poi生成简单word文档并导出问题,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2024-06-06
  • 关于Spring中@Transactional事务回滚的注意事项

    关于Spring中@Transactional事务回滚的注意事项

    这篇文章主要介绍了关于Spring中@Transactional事务回滚的注意事项,回滚(Rollback)指的是程序或数据处理错误,将程序或数据恢复到上一次正确状态的行为。回滚包括程序回滚和数据回滚等类型,需要的朋友可以参考下
    2023-05-05
  • Java模拟实现QQ三方登录(单点登录2.0)

    Java模拟实现QQ三方登录(单点登录2.0)

    这篇文章主要为大家详细介绍了Java模拟实现QQ三方登录,单点登录2.0,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2020-06-06

最新评论