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

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的列。你的查询存在两个核心问题:

  1. ORDER BY引用的check_in_date未在SELECT中定义
  2. 分组依据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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.19 14:15:34