1055 - Expression #5 of SELECT list is not in GROUP BY clause and contains nonaggregated column '36.36_analyse.vehicle_id' which is not functionally dependent on columns in GROUP BY clause; this is incompatible with sql_mode=only_full_group_by
时间: 2023-07-18 10:09:07 浏览: 188
这个问题是因为 MySQL 数据库的 sql_mode 模式默认开启了 only_full_group_by。这个模式要求 GROUP BY 语句中的每个列都必须出现在 SELECT 语句中,或者是在聚合函数中进行计算。而这个查询中 SELECT 语句中的字段不在 GROUP BY 语句中,而且也没有使用聚合函数,所以会报错。
解决方法有两种:
1. 可以将 sql_mode 设置为非 only_full_group_by 模式。具体方法是在 MySQL 配置文件中,找到 [mysqld] 部分,添加如下语句:
```
[mysqld]
sql_mode=STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_ENGINE_SUBSTITUTION
```
2. 修改查询语句,将 SELECT 语句中未出现在 GROUP BY 语句中的列使用聚合函数计算,或者将这些列也加入到 GROUP BY 语句中。
例如:
```
SELECT vehicle_id, COUNT(*) AS cnt
FROM your_table
GROUP BY vehicle_id;
```
相关问题
1055 - Expression #1 of SELECT list is not in GROUP BY clause and contains nonaggregated column 'mysql.p.id' which is not functionally dependent on columns in GROUP BY clause; this is incompatible with sql_mode=only_full_group_by1055 - Expression #1 of SELECT list is not in GROUP BY clause and contains nonaggregated column 'mysql.p.id' 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` 子句中未包含所有非聚合列,则会触发错误。以下是解决此问题的几种方法:
#### 方法一:修改 SQL 查询
确保 `SELECT` 列表中的所有非聚合列都明确地出现在 `GROUP BY` 子句中。例如,假设原始查询如下:
```sql
SELECT some_column, start_time
FROM gstq.scheduled_task_log
GROUP BY some_column;
```
可以通过将 `start_time` 添加到 `GROUP BY` 子句中来修复:
```sql
SELECT some_column, start_time
FROM gstq.scheduled_task_log
GROUP BY some_column, start_time;[^1]
```
#### 方法二:使用聚合函数
对于不需要具体值的非聚合列,可以使用聚合函数(如 `ANY_VALUE()`)来处理。例如:
```sql
SELECT some_column, ANY_VALUE(start_time)
FROM gstq.scheduled_task_log
GROUP BY some_column;[^4]
```
`ANY_VALUE()` 函数允许在开启 `only_full_group_by` 模式的情况下选择任意一个值,而无需将其添加到 `GROUP BY` 子句中。
#### 方法三:临时禁用 `only_full_group_by`
可以通过修改当前会话的 `sql_mode` 来临时禁用 `only_full_group_by` 模式:
```sql
SET sql_mode=(SELECT REPLACE(@@sql_mode,'ONLY_FULL_GROUP_BY',''));[^1]
```
这种方法仅对当前会话有效,重启数据库或新会话时需要重新设置。
#### 方法四:永久禁用 `only_full_group_by`
如果需要永久禁用该模式,可以在 MySQL 配置文件(通常是 `/etc/my.cnf` 或 `/etc/mysql/my.cnf`)中修改 `sql_mode` 参数。找到配置文件后,添加或修改以下内容:
```ini
sql_mode=STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION
```
保存文件后,重启 MySQL 服务以使更改生效:
```bash
sudo systemctl restart mysql;
```
### 注意事项
- 禁用 `only_full_group_by` 模式可能会导致查询结果不确定,尤其是在非聚合列中存在多个值的情况下。
- 推荐使用 `ANY_VALUE()` 函数作为替代方案,因为它既能保持查询结果的清晰性,又能避免修改全局配置。
```sql
-- 示例查询
SELECT some_column, ANY_VALUE(start_time)
FROM gstq.scheduled_task_log
GROUP BY some_column;
```
[Err] 1055 - Expression #1 of SELECT list is not in GROUP BY clause and contains nonaggregated colum...
这个错误通常发生在MySQL中,因为MySQL对于GROUP BY查询有一些特殊的限制。
当你在SELECT语句中使用了GROUP BY子句时,MySQL要求在SELECT列表中包含GROUP BY子句中的所有列或者使用聚合函数(如SUM、COUNT、AVG等)对其他列进行聚合。这是为了保证查询结果的正确性。
你可以尝试在SELECT语句中将所有列都包含在GROUP BY子句中,或者使用聚合函数对其他列进行聚合。例如:
```
SELECT column1, column2, SUM(column3)
FROM table
GROUP BY column1, column2
```
这样就可以避免这个错误了。
阅读全文
相关推荐















