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

如何合并两类用户统计查询并实现分页功能?

问题需求

需要实现一个带分页的查询,同时统计两类数据:

  1. 按country和city分组,过去一年的非活跃用户数(end_date不为空的用户)
  2. 同分组下全时段的活跃用户数(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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.10 08:20:34