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

Laravel中groupBy查询失效求助:按attr_id分组去重

解决Laravel中groupBy报错的问题

嘿,我刚碰到过一模一样的坑!这个报错其实是MySQL严格模式在起作用——当你用GROUP BY分组时,SELECT列表里的字段要么必须出现在GROUP BY子句里,要么得用聚合函数(比如MIN、MAX)包裹,不然MySQL会认为你的查询逻辑不明确,直接拒绝执行。

你原来的代码Attribute::groupBy('attr_id')->get()会尝试取出attr_id和value两个字段,但value既不在GROUP BY里,也没有被聚合处理,所以触发了1055错误。

下面给你几个靠谱的解决方案,按需选就行:

方案1:用聚合函数指定要保留的value

如果你只需要每个attr_id对应的任意一个value(比如第一个、最后一个),可以用聚合函数把value包裹起来:

use Illuminate\Support\Facades\DB;

// 取每个attr_id对应的最小value,也可以换成MAX()取最大的
$attrs = Attribute::select('attr_id', DB::raw('MIN(value) as value'))
                  ->groupBy('attr_id')
                  ->get();

方案2:获取每个attr_id对应的最新/最早记录

如果需要每个attr_id对应的最新一条记录(假设表有自增主键id),可以用子查询先拿到每个分组的最大id,再查询对应记录:

$attrs = Attribute::whereIn('id', function ($query) {
    $query->select(DB::raw('MAX(id)'))
          ->from('attributes')
          ->groupBy('attr_id');
})->get();

这个方法性能不错,而且完全符合SQL规范,不会有后续隐患。

方案3:内存中分组处理(小数据量适用)

如果你的数据量不大,可以先把所有数据查出来,再在PHP层面分组取每组的第一条:

$attrs = Attribute::all()->groupBy('attr_id')->map(function ($group) {
    return $group->first();
});

注意:数据量大的话别用这个,会占用太多内存拖慢性能。

不推荐的方案:关闭MySQL严格模式

虽然修改config/database.php里的strict选项为false能暂时解决报错,但这相当于绕过了SQL的规范约束,长期来看容易埋下逻辑隐患,真心不建议这么做。

内容的提问来源于stack exchange,提问作者Dumitru

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.28 03:57:29