GROUP BY语法错误排查:sql_mode=only_full_group_by引发的1055错误
解决Laravel中GROUP BY与sql_mode=only_full_group_by兼容问题
错误原因
MySQL的only_full_group_by模式要求:SELECT列表中的所有非聚合列必须出现在GROUP BY子句中,或功能依赖于GROUP BY的列。你的查询存在两个核心问题:
- ORDER BY引用的
check_in_date未在SELECT中定义 - 分组依据
DATE(worker_times.check_in)未纳入SELECT列表,违反了模式约束
修正方案(推荐)
调整查询逻辑,确保SELECT列表包含分组字段,且GROUP BY与SELECT列对应:
use Illuminate\Support\Facades\DB; public function builder() { return WorkerTime::query() ->select([ 'workers.id', 'workers.name', 'companies.name AS company_name', DB::raw('DATE(worker_times.check_in) AS check_in_date') ]) ->join('workers', 'workers.id', '=', 'worker_times.worker_id') ->join('companies', 'companies.id', '=', 'workers.company_id') ->where('companies.id', 1) ->groupBy('workers.id', 'check_in_date') ->orderBy('check_in_date', 'ASC'); }
修正说明
- 通过
DB::raw()将分组依据字段DATE(worker_times.check_in)以别名check_in_date加入SELECT列表,满足only_full_group_by的约束 - 使用
groupBy直接引用别名替代groupByRaw,代码更简洁且逻辑清晰 - ORDER BY使用的
check_in_date已在SELECT中定义,不再触发语法错误
临时替代方案(不推荐生产环境)
若需临时绕过严格检查,可修改Laravel数据库配置,移除ONLY_FULL_GROUP_BY模式:
打开config/database.php,修改mysql配置的modes项:
'mysql' => [ // 保留其他原有配置 'modes' => [ 'STRICT_TRANS_TABLES', 'NO_ZERO_IN_DATE', 'NO_ZERO_DATE', 'ERROR_FOR_DIVISION_BY_ZERO', 'NO_ENGINE_SUBSTITUTION', ], ],
注意:此方案会关闭MySQL的严格分组校验,可能导致统计结果不准确,仅建议用于测试场景。
内容的提问来源于stack exchange,提问作者Francisco Moreno Santaella
相关产品推荐
相关产品推荐

