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

Laravel 5.7分组查询报错:products.name不在GROUP BY中

问题解答

为什么会报错?

在MySQL严格模式下(Laravel 5.7默认启用该模式),GROUP BY子句必须包含SELECT语句中所有非聚合函数的字段。你当前的SELECT里包含products.name和product_id两个非聚合字段,但只对product_id分组,数据库层面会严格校验非聚合字段的唯一性(即便业务上product_id作为主键对应唯一名称),因此触发报错。

是否必须把SELECT中所有参数加入GROUP BY?

是的,在严格模式下必须这么做。这是SQL标准的要求,目的是避免分组后出现数据歧义——确保每个分组的非聚合字段值是唯一确定的。

解决方法

方法1:将非聚合字段全部加入GROUP BY

这是最规范的做法,因为product_id是products表的主键,每个product_id对应唯一的products.name,加入分组不会影响统计结果:

$top_items = Sell::whereBetween('date', [Carbon::now()->startOfMonth(), Carbon::now()->endOfMonth()])
    ->leftJoin('products', 'products.id', '=', 'sells.product_id')
    ->selectRaw('sum(sells.quantity) as sell_quantity, products.name as product_name, sells.product_id')
    ->groupBy('sells.product_id', 'products.name')
    ->orderBy('sell_quantity', 'desc')
    ->limit(10)
    ->get();

注意:你原来的orderBy('sells.quantity', 'desc')是错误的,应该按聚合后的别名sell_quantity排序,否则会按单条销售记录的数量排序,而非总销量。

方法2:关闭MySQL严格模式(不推荐)

如果确实不想修改GROUP BY,可以修改config/database.php中MySQL的配置,将strict设为false:

'mysql' => [
    // ...其他配置项
    'strict' => false,
],

但这种方法会降低数据校验的严谨性,可能导致潜在的数据不一致问题,不建议在生产环境使用。

内容的提问来源于stack exchange,提问作者Md Mahmudul Hasan Emon

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.16 17:05:01