mysql严格模式导致sql查询失败,references column '***' which is not in SELECT list

一、背景

在最近的一次版本发布之后,在后台日志中发现了如下错误信息:

从日志里我们可以看出来,提示sql语句里的ORDER BY与DISTINCT不兼容;

检查后发现sql语句中有类似如下格式的语句,确实我们在使用order by的同时又使用了distinct

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后面的分组字段,或使用聚合函数包裹着的字段,否则会报错如下信息:

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去重查询。否则会报错如下信息:

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之后即会失效)

# 查看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(永久修改)

vim /etc/my.cnf
service mysqld restart

再次执行sql,发现语句成功执行。

 

posted @ 2021-02-25 11:05  少说点话  阅读(1835)  评论(0编辑  收藏  举报
网站运行: