Laravel左连接查询无结果默认返回0 加日期筛选后结果为空如何解决
问题原因
你当前的错误是因为对左连接的右表直接使用全局WHERE条件导致的:左连接查询中,没有匹配到统计结果的活动对应的campaigns_products_results表所有字段均为NULL,你直接加全局日期筛选会把这部分数据全部过滤,原本要保留的「无统计结果返回0」的活动就会被排除,最终出现返回空或者数据不全的问题。
解决方案
把日期筛选条件从全局WHERE移到左连接的ON子句中,仅筛选右表中符合日期范围的记录,不会过滤左表的活动数据,代码示例如下:
$list = DB::table('campaigns') ->leftJoin('campaigns_products_results', function ($join) { // 关联条件 + 日期范围筛选都写在join的闭包里 $join->on('campaigns_products_results.campaign_id', '=', 'campaigns.id') // 筛选昨日数据的写法 ->whereDate('campaigns_products_results.created_at', Carbon::yesterday()); // 如果需要筛选近7天,替换上面的whereDate为下面的写法即可 // ->whereBetween('campaigns_products_results.created_at', [Carbon::now()->subDays(6)->startOfDay(), Carbon::yesterday()->endOfDay()]) });
同时你原来的统计逻辑可以简化,CASE WHEN的判断可以直接用COALESCE函数实现,并且需要补充GROUP BY分组逻辑,否则统计结果会合并成一行:
$list->select('campaigns.*', DB::raw('COALESCE(SUM(campaigns_products_results.total_views), 0) AS total_views') ) ->groupBy('campaigns.id');
如果你的数据库开启了严格模式分组报错,把select中的campaigns.*替换为具体需要查询的活动字段,全部加入groupBy即可。
内容的提问来源于stack exchange,提问作者jkoopman
相关产品推荐
相关产品推荐

