一、背景
在最近的一次版本发布之后,在后台日志中发现了如下错误信息:
从日志里我们可以看出来,提示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,发现语句成功执行。