mysql严格模式导致sql查询失败,references column '***' which is not in SELECT list
一、背景
在最近的一次版本发布之后,在后台日志中发现了如下错误信息:
从日志里我们可以看出来,提示sql语句里的ORDER BY与DISTINCT不兼容;
检查后发现sql语句中有类似如下格式的语句,确实我们在使用order by的同时又使用了distinct
1 2 3 | SELECT distinct req.requirement_no, req.requirement_name FROM leanmanage_requirement req ORDER BY req.created_time DESC ; |
执行之后出现了如下的错误信息:
二、原因分析
查阅之后发现,在mysql5.7版本之后默认开启了严格模式,而对于上面这条sql,是因为默认启用了ONLY_FULL_GROUP_BY SQL模式。
1.在该模式下,我们使用GROUP BY查询时,出现在SELECT字段后面的只能是GROUP BY后面的分组字段,或使用聚合函数包裹着的字段,否则会报错如下信息:
1 | Expression #1 of SELECT list is not in GROUP BY clause and contains nonaggregated column 'database.table.column' which is not functionally dependent on columns in GROUP BY clause; this is incompatible with sql_mode=only_full_group_by |
2.当使用ORDER BY查询时,不能使用SELECT DISTINCT去重查询。否则会报错如下信息:
1 | Expression #1 of ORDER BY clause is not in SELECT list, references column 'database.table.column' which is not in SELECT list; this is incompatible with DISTINCT |
三、解决方案
既然知道了问题产生的原因,我们可以通过以下两种方法进行修改。
1.修改sql语句,使其符合规范
2.关闭ONLY_FULL_GROUP_BY SQL模式
四、测试实践
1.使用命令关闭ONLY_FULL_GROUP_BY SQL模式(暂时的,重启mysql之后即会失效)
1 2 3 4 5 6 7 | # 查看mysql版本 select VERSION(); # 查看全局设置 sql_mode select @@sql_mode; SHOW GLOBAL VARIABLES where Variable_name = 'sql_mode' ; # 使用命令关闭ONLY_FULL_GROUP_BY SQL模式(暂时的,重启mysql之后即会失效) set global sql_mode= 'STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_ENGINE_SUBSTITUTION' ; |
2.修改mysql配置文件,并重启mysql(永久修改)
1 2 | vim /etc/my .cnf service mysqld restart |
再次执行sql,发现语句成功执行。
本博客文章均已测试验证,欢迎评论、交流、点赞。
部分文章来源于网络,如有侵权请联系删除。
转载请注明原文链接:https://www.cnblogs.com/sueyyyy/p/14445569.html
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 园子的第一款AI主题卫衣上架——"HELLO! HOW CAN I ASSIST YOU TODAY
· 【自荐】一款简洁、开源的在线白板工具 Drawnix