Laravel查询构造器SQL在phpMyAdmin正常Postman报GROUP BY 1055错误
问题原因
- 你编写的lx02表子查询中,GROUP BY仅指定了
material单个字段,但SELECT列表中包含了bUn、type、storageBin三个未做聚合处理、也未加入GROUP BY的字段,不符合标准SQL的分组查询规范。 - phpMyAdmin连接MySQL时默认关闭了
ONLY_FULL_GROUP_BY校验模式,允许非标准的分组语句执行,因此可以正常返回结果。 - Laravel默认开启数据库严格模式,会自动启用
ONLY_FULL_GROUP_BY等SQL语法校验规则,不符合规范的语句会直接抛出语法错误。
解决方案
方案1:调整分组逻辑符合SQL标准(推荐)
将SELECT列表中所有非聚合的普通字段都加入GROUP BY规则中,调整后的Laravel代码如下:
$report = DB::table('directoscount')->select('parte', DB::raw('SUM(cantidad)'))->whereNull('deleted_at')->groupBy('parte'); $report = DB::table(DB::raw("({$report->toSQL()}) as conteoDirectos"))->leftJoin( DB::raw('(SELECT material, bUn, SUM(totalStock), type, storageBin FROM `lx02` WHERE deleted_at IS null GROUP BY material, bUn, type, storageBin ) as lx02'), function($join){ $join->on('conteoDirectos.parte', '=', 'lx02.material'); } )->get();
如果同一个material对应的bUn、type、storageBin值是唯一的,新增分组字段不会改变查询结果,同时完全符合SQL规范。
方案2:临时关闭严格校验(不推荐)
如果确实需要保留原有查询逻辑,可以在执行查询前临时关闭SQL模式校验:
// 临时关闭当前连接的ONLY_FULL_GROUP_BY校验 DB::statement("SET sql_mode = REPLACE(@@sql_mode, 'ONLY_FULL_GROUP_BY', '')"); $report = DB::table('directoscount')->select('parte', DB::raw('SUM(cantidad)'))->whereNull('deleted_at')->groupBy('parte'); // 后续原有查询逻辑不变
也可以修改config/database.php中mysql配置项下的strict值为false,全局关闭严格模式,但该操作会隐藏其他SQL语法问题,不建议长期使用。
内容的提问来源于stack exchange,提问作者cesgdav
相关产品推荐
相关产品推荐

