Laravel中原生SQL执行失败:GROUP BY触发1055错误
解决Laravel中GROUP BY导致的1055语法错误问题
这个错误的根源是MySQL的ONLY_FULL_GROUP_BY SQL模式——它是MySQL严格模式的一部分,要求SELECT子句里的每一列要么明确出现在GROUP BY子句中,要么被聚合函数(比如MAX()、MIN()、COUNT())包裹。你的查询里last_operation既不在GROUP BY里,也没有用聚合函数,所以Laravel调用MySQL执行时就触发了这个错误;而phpMyAdmin能正常执行,大概率是因为它的数据库连接没有启用这个严格模式。
下面给你几个可行的解决方案:
方案1:修改SQL语句(推荐)
既然你要按user_id分组,那得明确指定每个用户对应的last_operation是哪一条记录的值——比如取最新的操作时间,用MAX()聚合函数:
$lastOperationUser = DB::select("SELECT MAX(last_operation) as last_operation, user_id FROM policies INNER JOIN users ON policies.user_id=users.id GROUP BY user_id;");
如果需要最早的操作时间,就把MAX()换成MIN()。这样的查询完全符合ONLY_FULL_GROUP_BY的要求,不会再报错。
方案2:关闭Laravel的ONLY_FULL_GROUP_BY模式
如果你确实不需要严格的分组校验,可以修改Laravel的数据库配置来关闭这个模式:
- 打开项目根目录下的
config/database.php - 找到
mysql配置项里的modes数组,移除ONLY_FULL_GROUP_BY,修改后大概是这样:
'mysql' => [ // 其他配置项... 'modes' => [ 'STRICT_TRANS_TABLES', 'NO_ZERO_IN_DATE', 'NO_ZERO_DATE', 'ERROR_FOR_DIVISION_BY_ZERO', 'NO_ENGINE_SUBSTITUTION', ], ],
注意:这种方法会降低SQL的规范性,可能导致一些逻辑不严谨的查询被执行,所以只推荐在特殊场景下使用。
方案3:使用Laravel查询构造器(更符合框架风格)
用Laravel自带的查询构造器来编写,代码更易读也更易维护:
$lastOperationUser = DB::table('policies') ->join('users', 'policies.user_id', '=', 'users.id') ->selectRaw('MAX(last_operation) as last_operation, user_id') ->groupBy('user_id') ->get();
内容的提问来源于stack exchange,提问作者user3892232
相关产品推荐
相关产品推荐

