使用group by查询时报错ORDER BY clause is not in GROUP BY..this is incompatible with sql_mode=only_full_grou

本文介绍了一种在SQL中禁用ONLY_FULL_GROUP_BY的方法,通过使用REPLACE函数修改全局sql_mode设置,允许在不完全匹配GROUP BY字段的情况下执行聚合操作。
select @@global.sql_mode



SET @@GLOBAL.sql_mode = (SELECT REPLACE(@@sql_mode,'ONLY_FULL_GROUP_BY',''));

在这里插入图片描述

### 解决 MySQL 报错 1055 关于 `sql_mode=only_full_group_by` 的问题 MySQL 5.7及以上版本默认启用了 `only_full_group_by` 模式,该模式要求在 `GROUP BY` 子句中列出所有非聚合列。如果查询的 `SELECT` 列表包含未聚合的列,并且这些列不在 `GROUP BY` 子句中,则会触发错误 1055。 #### 方法一:修改 SQL 模式以禁用 `only_full_group_by` 可以通过调整 MySQLSQL 模式来禁用 `only_full_group_by`。以下是具体步骤: 1. **临禁用** 在当前会话中执行以下命令以禁用 `only_full_group_by`: ```sql SET GLOBAL sql_mode=(SELECT REPLACE(@@sql_mode,'ONLY_FULL_GROUP_BY','')); ``` 或者仅针对当前会话: ```sql SET SESSION sql_mode=(SELECT REPLACE(@@sql_mode,'ONLY_FULL_GROUP_BY','')); ``` 2. **永久禁用** 修改 MySQL 配置文件(通常是 `my.cnf` 或 `my.ini`),找到 `[mysqld]` 部分并添加或修改以下内容: ```ini [mysqld] sql_mode='STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_ENGINE_SUBSTITUTION' ``` 然后重启 MySQL 服务以使更改生效[^4]。 #### 方法二:调整查询逻辑以符合 `only_full_group_by` 要求 如果不想禁用 `only_full_group_by`,可以修改查询以确保所有非聚合列都在 `GROUP BY` 子句中。例如: 假设原始查询如下: ```sql SELECT user_id, nick, COUNT(*) AS cnt FROM solution GROUP BY user_id; ``` 此查询报错,因为 `nick` 列未聚合且未出现在 `GROUP BY` 子句中。可以将其添加到 `GROUP BY` 中: ```sql SELECT user_id, nick, COUNT(*) AS cnt FROM solution GROUP BY user_id, nick; ``` 或者使用聚合函数处理非聚合列: ```sql SELECT user_id, MAX(nick) AS nick, COUNT(*) AS cnt FROM solution GROUP BY user_id; ``` #### 方法三:验证当前 SQL 模式 在修改配置之前,可以检查当前的 SQL 模式以确认是否启用了 `only_full_group_by`: ```sql SELECT @@sql_mode; ``` #### 注意事项 - 禁用 `only_full_group_by` 可能会导致查询结果不符合预期,尤其是在数据不一致的情况下。 - 推荐优先考虑调整查询逻辑以符合标准,而不是简单地禁用 `only_full_group_by`[^3]。 ### 示例代码 以下是一个完整的示例,展示如何通过修改 SQL 模式和查询逻辑解决该问题: ```sql -- 检查当前 SQL 模式 SELECT @@sql_mode; -- 临禁用 only_full_group_by SET SESSION sql_mode=(SELECT REPLACE(@@sql_mode,'ONLY_FULL_GROUP_BY','')); -- 原始查询(会报错) SELECT user_id, nick, COUNT(*) AS cnt FROM solution GROUP BY user_id; -- 修改后的查询(方法一:添加到 GROUP BY) SELECT user_id, nick, COUNT(*) AS cnt FROM solution GROUP BY user_id, nick; -- 修改后的查询(方法二:使用聚合函数) SELECT user_id, MAX(nick) AS nick, COUNT(*) AS cnt FROM solution GROUP BY user_id; ``` ---
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值