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
相关产品推荐
相关产品推荐

