关于lumen严格模式接口mysql5.6和mysql5.7报错问题

sql语句
SELECT DISTINCT
	`someid` 
FROM
	`sometable` 
WHERE
	`id` IN ( 123, 456, 789 ) 
	AND `status` = 1 
ORDER BY
	`updatetime` DESC 
	LIMIT 10 OFFSET 0
环境配置
生产环境使用的是 MySQL 5.6,而开发环境使用的是 MySQL 5.7。
生产环境的 SQL Mode 是空,开发环境的SQL Mode是 NO_ENGINE_SUBSTITUTION。
Lumen 配置:Lumen 的数据库配置文件中的 'strict' => env('DB_STRICT_MODE', true) 。
错误现象
  • sql语句在生产环境(MySQL5.6.16-log)和开发环境(MySQL5.7.32-log)执行都正常;
  • lumen接口在生产环境返回正常;在开发环境返回错误;
错误信息
General error: 3065 Expression #1 of ORDER BY clause is not in SELECT list, references column 'sometable.updatetime' which is not in SELECT list; this is incompatible with DISTINCT。
这个错误是因为在 SQL 查询中,你试图在 SELECT DISTINCT 语句后使用 ORDER BY 子句,而这个子句引用的列不在 SELECT 列表中。
问题分析

当你使用 DISTINCT 关键字时,SELECT 语句将返回唯一的行这意味着,你在 ORDER BY 子句中引用的任何列都必须包含在 SELECT 列表中,因为这些列是用来确定哪些行是“唯一”的。

解决方案
将 ORDER BY 子句中引用的列添加到 SELECT 列表中,或者删除 ORDER BY 子句。
总结

由于lumen指定了严格模式,导致接口会话的执行和navicat的窗口执行sql_mode是不同状态,所以测试环境的数据库能执行,但测试环境的接口不能执行。但为什么生产环境的数据库和生产环境的接口都能执行,还并不清楚。草草记录,留给需要的同学参考,欢迎各位同学指正。

你可能感兴趣的:(PHP,php)