Laravel使用group by分组时如何忽略null值不进行合并
解决方案
这个需求完全可以实现,核心思路是调整分组规则:非空的content_related_group按原有字段分组,值为null的记录用唯一主键作为分组依据,保证每个null值记录单独成组。
调整后的查询代码
$products = DB::table('product') ->select('*', DB::raw('count(*) as total')) ->orderBy('created_at', 'desc') // 核心修改:分组规则区分null和非null值 ->groupBy(DB::raw('CASE WHEN content_related_group IS NOT NULL THEN content_related_group ELSE id END')) ->paginate(9);
逻辑说明
- 当
content_related_group不为null时,分组依据为该字段本身,相同值的记录会合并为同一组,符合原有需求 - 当
content_related_group为null时,分组依据替换为唯一主键id,每个记录的id都是唯一值,因此所有null值记录都会单独保留,不会被合并 - 调整后对应你给出的示例数据,刚好可以得到你预期的3条查询结果。
注意事项
如果你的数据库开启了ONLY_FULL_GROUP_BY模式(MySQL 5.7及以上版本默认开启),直接使用select *可能会触发SQL语法报错,因为分组后未出现在group by条件中的非聚合字段无法被直接查询。这种情况可以调整select部分,明确指定需要的字段,或配合子查询先排序再取分组内的目标记录。
内容的提问来源于stack exchange,提问作者Catto
相关产品推荐
相关产品推荐

