mysql group by 报错only_full_group_by
时间: 2024-01-05 07:21:10 浏览: 101
在MySQL中,当使用GROUP BY语句进行分组查询时,如果SELECT列表中的列不在GROUP BY子句中,并且这些列不是函数依赖于GROUP BY子句中的列,就会出现"Expression #1 of SELECT list is not in GROUP BY clause and contains nonaggregated column"的错误。这是因为MySQL的sql_mode设置为only_full_group_by,要求SELECT列表中的列必须在GROUP BY子句中或者是聚合函数的参数。
解决这个问题的方法有多种,其中一种方法是使用ANY_VALUE()函数来抑制ONLY_FULL_GROUP_BY值被拒绝。ANY_VALUE()函数可以用于选择GROUP BY子句中的任意一个值作为结果。
下面是一个示例,演示了如何使用ANY_VALUE()函数来解决"only_full_group_by"报错:
```sql
SELECT ANY_VALUE(info_id) as info_id, data_no
FROM ath_tag
WHERE locate(tag_name,'疾病')
GROUP BY data_no;
```
这个查询将选择每个data_no分组中的任意一个info_id值作为结果,从而避免了"only_full_group_by"报错。
相关问题
division by zero_MySql报错only_full_group_by的解决办法
这个错误是由于MySQL的版本更新所导致的,MySQL默认情况下在使用GROUP BY聚合函数时会进行严格模式的检查,只允许SELECT语句中的列出现在GROUP BY子句中或者使用聚合函数进行计算。
解决这个问题可以在MySQL的配置文件中或者在查询时设置SQL_MODE为非严格模式,具体方法如下:
1. 修改MySQL的配置文件my.cnf,在[mysqld]下添加以下内容:
```
sql_mode=STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_ENGINE_SUBSTITUTION
```
2. 在查询时设置SQL_MODE,如下所示:
```
SET SQL_MODE='STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_ENGINE_SUBSTITUTION';
```
以上两种方法都可以解决这个问题,建议使用第一种方法对MySQL进行全局的设置。
报错only_full_group_by
这个错误是由于 MySQL 数据库的 `ONLY_FULL_GROUP_BY` 模式引起的。该模式要求在使用 GROUP BY 子句时,SELECT 查询中的列必须属于 GROUP BY 子句中的列或者是聚合函数。如果查询中的列不满足该条件,就会出现 "SELECT list is not in GROUP BY clause and contains nonaggregated column" 的错误。
解决这个问题的方法有两种:
1. 修改 MySQL 配置:可以通过修改 MySQL 配置文件中的 `sql_mode` 参数来禁用 `ONLY_FULL_GROUP_BY` 模式。在配置文件中添加或修改以下行:
```
[mysqld]
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 服务使配置生效。
2. 修改查询语句:可以修改查询语句,确保 SELECT 列都符合 `ONLY_FULL_GROUP_BY` 模式的要求。将不满足要求的列进行聚合操作,或者将其添加到 GROUP BY 子句中。
请注意,修改 MySQL 配置可能会影响其他查询,所以建议在修改之前备份数据库或者仅对特定的查询进行修改。
阅读全文