真正有效解决ONLY_FULL_GROUP_BY的问题

问题描述

在
报错 如上图 在mysql 5.7版本下可能会报如下错误

Error Code: 1055. Expression #3 of SELECT list is not in GROUP BY clause and contains nonaggregated column ‘×××’ which is not functionally dependent on columns in GROUP BY clause; this is incompatible with sql_mode=only_full_group_by

原因 是在5.7下mysql的model默认为

ONLY_FULL_GROUP_BY

含义 sql中select后面的字段必须出现在group by后面,或者被聚合函数包裹,不然会抛出上面的错误 如以下sql

select A.column1, A.column2 from table as A group by column1 //会因为ONLY_FULL_GROUP_BY的缘故抛出上面错误

问题解决

思路一

既然是这个模式限制的问题 我们可以修改该模式,找到配置文件 修改配置即可。

vim /etc/mysql/my.cnf

文件名如上所示,但是地址可能得看具体环境了

[mysql]
# 设置mysql客户端默认字符集
default-character-set=utf8 
[mysqld]
#设置3306端口
port = 3306
# 设置mysql的安装目录
basedir=%MYSQL_HOME%
# 允许最大连接数
max_connections=200
# 服务端使用的字符集默认为8比特编码的latin1字符集
character-set-server=utf8
# 创建新表时将使用的默认存储引擎
default-storage-engine=INNODB
# 设置模式
sql_mode =STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_ENGINE_SUBSTITUTION

datadir = D:\mysql-5.7.27-winx64\data

注意这里的sql_mode 是配置在[mysqld]下面的
然后就是重启mysql服务

思路二

我们得承认这个模式是很有意义的。而我们又想实现如下sql的效果

select A.column1, A.column2 from table as A group by column1 

首先我们得理解我们写的上面的sql的含义 按column1进行分组 那么结果就是这个组内的cloumn1都是相同的,但是column2却没有限制,也就是说可能相同 也可能不同,那么数据库不知道column2该返回什么值给你

那么我们有两种方案

  1. 在group by后面追加上column2就可以了,意义相当于按照 由column1和column2拼接成的联合字段进行分组
select A.column1, A.column2 from table as A group by column1 , column2
  1. 或者在内查询里只查询分组的字段, 各位可以参考如下形式
SELECT A.column1, A.column2 FROM TABLE A JOIN ( SELECT max(id) id, column1 FROM TABLE b GROUP BY column_1 ) C ON A.column1 = C.column1 and C.id = A.id

以上是我的一些经验 如果不对 还请留言告知

补充

以下内容来之评论区,一个很好的补充和总结,谢谢 @以太的咸鱼日常

  1. MySQL5.7之后,sql_mode中ONLY_FULL_GROUP_BY模式默认设置为打开状态。
  2. ONLY_FULL_GROUP_BY的语义就是确定select target list中的所有列的值都是明确语义,简单的说来,在此模式下,target list中的值要么是来自于聚合函数(sum、avg、max等)的结果,要么是来自于group by list中的表达式的值
  3. MySQL提供了any_value()函数来抑制ONLY_FULL_GROUP_BY值被拒绝
  4. any_value()会选择被分到同一组的数据里第一条数据的指定列值作为返回数据
  • 53
    点赞
  • 127
    收藏
    觉得还不错? 一键收藏
  • 19
    评论
报错 "only_full_group_by" 是 MySQL 数据库中的一个错误。它是由于在使用 GROUP BY 子句时,SELECT 语句中的列未在聚合函数中进行处理而导致的。 解决这个问题可以通过以下几种方式: 1. 使用聚合函数处理所有未在 GROUP BY 子句中的列:将 SELECT 语句中的列名添加到 GROUP BY 子句中或者将它们包装在相应的聚合函数(如 COUNT、SUM、MAX 等)中。 例如,如果你有以下的 SELECT 语句: ```sql SELECT id, name, SUM(quantity) FROM orders GROUP BY id; ``` 你可以修改为: ```sql SELECT id, name, SUM(quantity) FROM orders GROUP BY id, name; ``` 或者将未在 GROUP BY 子句中的列使用聚合函数处理: ```sql SELECT id, MAX(name) AS name, SUM(quantity) FROM orders GROUP BY id; ``` 2. 禁用 `ONLY_FULL_GROUP_BY` 模式:在会话级别或全局级别上修改 MySQL 配置,将 `sql_mode` 中的 `ONLY_FULL_GROUP_BY` 移除或替换为空字符串。请注意,这可能会导致其他潜在问题,因此需要谨慎使用。 例如,你可以执行以下 SQL 语句来禁用 `ONLY_FULL_GROUP_BY` 模式: ```sql SET GLOBAL sql_mode=(SELECT REPLACE(@@sql_mode,'ONLY_FULL_GROUP_BY','')); ``` 3. 更新 MySQL 版本:如果你正在使用较旧的 MySQL 版本,可以尝试升级到较新的版本。较新的 MySQL 版本通常对 SQL 标准的支持更好,可能会解决问题。 请注意,在进行任何更改之前,请备份你的数据库以防意外发生。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值