You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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的数据库配置来关闭这个模式:

  1. 打开项目根目录下的config/database.php
  2. 找到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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.25 02:28:51