1055 - Expression #5 of SELECT list is not in GROUP BY clause and contains nonaggregated column 'mts.a.direct_customers' which is not functionally dependent on columns in GROUP BY clause; this is incompatible with sql_mode=only_full_group_by
时间: 2025-06-01 15:59:44 浏览: 24
### 解决方案
在 MySQL 5.7 及更高版本中,`sql_mode` 默认包含 `ONLY_FULL_GROUP_BY` 模式。这种模式要求在使用 `GROUP BY` 时,`SELECT` 列表中的所有非聚合列都必须出现在 `GROUP BY` 子句中[^1]。如果未满足此条件,则会触发错误。
以下是几种解决该问题的常见方法:
#### 方法一:修改 `sql_mode` 配置
可以通过移除 `ONLY_FULL_GROUP_BY` 来避免此错误。具体操作如下:
1. 查询当前的 `sql_mode` 设置:
```sql
SELECT @@GLOBAL.sql_mode;
```
2. 修改 `sql_mode`,将 `ONLY_FULL_GROUP_BY` 移除:
```sql
SET GLOBAL sql_mode = 'STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_ENGINE_SUBSTITUTION';
```
注意:需要确保新设置的 `sql_mode` 不包含 `ONLY_FULL_GROUP_BY`,同时保留其他必要的模式[^3]。
#### 方法二:调整查询逻辑
如果不想更改全局配置,可以调整 SQL 查询以符合 `ONLY_FULL_GROUP_BY` 的要求。例如,在以下查询中:
```sql
SELECT id, username, COUNT(*) AS count FROM pot GROUP BY id;
```
由于 `username` 未出现在 `GROUP BY` 子句中,因此会报错。可以通过以下方式解决:
- 将 `username` 添加到 `GROUP BY` 中:
```sql
SELECT id, username, COUNT(*) AS count FROM pot GROUP BY id, username;
```
- 或者使用聚合函数处理 `username`(如 `MAX(username)`):
```sql
SELECT id, MAX(username) AS username, COUNT(*) AS count FROM pot GROUP BY id;
```
#### 方法三:验证功能依赖性
在某些情况下,`SELECT` 列表中的非聚合列可能与 `GROUP BY` 列存在功能依赖关系。此时,可以通过数据库设计验证并声明这种依赖性。例如,如果 `id` 唯一确定了 `username`,则可以认为 `username` 功能依赖于 `id`。但需要注意,MySQL 并不自动识别这种依赖性,通常需要通过调整查询或配置来解决[^2]。
#### 方法四:临时禁用 `ONLY_FULL_GROUP_BY`
可以在会话级别临时禁用 `ONLY_FULL_GROUP_BY`,而不影响全局配置:
```sql
SET SESSION sql_mode = 'STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_ENGINE_SUBSTITUTION';
```
---
### 示例代码
假设有一个表 `pot`,结构如下:
| id | username | value |
|-----|----------|-------|
| 1 | Alice | 10 |
| 1 | Alice | 20 |
| 2 | Bob | 30 |
原始查询:
```sql
SELECT id, username, SUM(value) AS total FROM pot GROUP BY id;
```
此查询会报错,因为 `username` 未出现在 `GROUP BY` 中。
解决方案 1:添加 `username` 到 `GROUP BY`:
```sql
SELECT id, username, SUM(value) AS total FROM pot GROUP BY id, username;
```
解决方案 2:使用聚合函数处理 `username`:
```sql
SELECT id, MAX(username) AS username, SUM(value) AS total FROM pot GROUP BY id;
```
---
### 注意事项
1. 修改 `sql_mode` 虽然可以快速解决问题,但可能导致数据结果不符合预期。建议优先调整查询逻辑。
2. 如果数据库设计合理且存在功能依赖关系,可以通过优化查询或明确声明依赖性来避免错误。
---
阅读全文
相关推荐


















