数据库报错
报错信息
: Expression #2 of SELECT list is not in GROUP BY clause and contains nonaggregated column 'hmdp.area.area_name' which is not functionally dependent on columns in GROUP BY clause; this is incompatible with sql_mode=only_full_group_by
中文意思
:SELECT列表的表达式#2不在GROUP BY子句中,并且包含非聚合列“hmdp.area.area_name”,该列在功能上不依赖于GROUP BY子句的列;这与sqlmode=onlyfull_groupby不兼容
原因
这个错误是由于MySQL的"sql_mode"设置为"only_full_group_by"引起的。"only_full_group_by"模式要求在GROUP BY子句中,除了聚合函数外,所有的SELECT列都必须在GROUP BY子句中出现。
解决方案
为了解决这个问题,有几种方法可以尝试:
- 重新设计查询:可以将非聚合列的值合并到聚合列中,或者使用聚合函数来处理非聚合列的值。
- 使用ANY_VALUE函数:如果你确定非聚合列的值在每个组中是唯一的,可以使用ANY_VALUE函数来解决问题。ANY_VALUE函数将返回每个组中的任意一个值,并且不受"only_full_group_by"模式的限制。
SELECT group_column, ANY_VALUE(sum_column) AS total_sum FROM my_table GROUP BY group_column;
- 修改sql_mode设置:如果你不想使用"only_full_group_by"模式,可以修改MySQL的"sql_mode"设置。
可以通过以下方式修改:
- 打开MySQL配置文件(通常是my.cnf或my.ini文件)。
- 找到"sql_mode"相关的设置。
- 修改"sql_mode"值,移除"only_full_group_by"模式。例如,可以将"sql_mode"设置为:
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服务。
请注意,修改"sql_mode"可能对其他查询和应用程序产生影响。确保在更改设置之前做好充分的测试。
本人最后采取第二种方案解决问题。
根据自己的需求和数据,选择适合的方法来解决问题。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· DeepSeek 开源周回顾「GitHub 热点速览」
· 物流快递公司核心技术能力-地址解析分单基础技术分享
· .NET 10首个预览版发布:重大改进与新特性概览!
· AI与.NET技术实操系列(二):开始使用ML.NET
· 单线程的Redis速度为什么快?
2022-09-23 Linux网关失效