如何合并两类用户统计查询并实现分页功能?
问题需求
需要实现一个带分页的查询,同时统计两类数据:
- 按
country和city分组,过去一年的非活跃用户数(end_date不为空的用户) - 同分组下全时段的活跃用户数(
end_date为空的用户)
原有的两个单独查询可分别实现单一统计,但无法合并后完成分页。
正确实现方式
可以在同一个查询中通过两个DB::raw()语句同时计算两类统计值,同时保留分页功能,无需拆分查询:
UserData::query() ->select([ 'country', 'city', // 全时段活跃用户数:统计分组内end_date为空的用户总数 DB::raw('SUM(CASE WHEN end_date IS NULL THEN 1 ELSE 0 END) AS active_all_time'), // 过去一年非活跃用户数:统计分组内created_at在过去一年且end_date不为空的用户数 DB::raw('SUM(CASE WHEN created_at BETWEEN ? AND ? AND end_date IS NOT NULL THEN 1 ELSE 0 END) AS not_active_past_year') ]) ->setBindings([ Carbon::now()->subYear(), Carbon::now() ]) ->groupBy('country', 'city') ->paginate(500);
逻辑说明
active_all_time:遍历全表数据,按分组统计end_date为空的用户总数,实现全时段活跃用户统计not_active_past_year:在同一分组统计逻辑中,增加created_at的时间范围判断,仅统计过去一年里end_date不为空的用户数- 使用
setBindings绑定时间参数,规避SQL注入风险 - 保留
paginate(500)实现分页功能,Laravel会自动处理分页的计数和数据切片逻辑
若需优化性能,可给country、city、created_at、end_date字段建立联合索引,提升分组和条件查询的效率。
内容的提问来源于stack exchange,提问作者pileup
相关产品推荐
相关产品推荐

