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,发现语句成功执行。

 

posted @   少说点话  阅读(3052)  评论(0编辑  收藏  举报
编辑推荐:
· 开发者必知的日志记录最佳实践
· 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
网站运行:7年51天17时24分9秒
点击右上角即可分享
微信分享提示

目录导航