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

Laravel预订应用SQL需求:追加符合条件的用户统计字段

解决方案:为团队报表追加有效用户统计

嘿,我明白你需要给现有团队报表加上「至少拥有1条该团队预订的用户数量」这个字段,下面分两种场景给你解决方案:

纯SQL写法(适配SequelPro直接执行)

你可以在原有查询中嵌入一个子查询来统计每个团队的有效用户数,核心是用COUNT(DISTINCT user_id)确保同一用户不会被重复统计:

SELECT 
    t.name, 
    t.email, 
    t.trial_ends_at,
    (SELECT COUNT(DISTINCT user_id) FROM bookings b WHERE b.team_id = t.id) AS active_user_count
FROM teams t 
ORDER BY t.trial_ends_at DESC;

这里的active_user_count就是你要的统计字段,它会返回每个团队下有至少1条预订的用户总数(即使某个团队没有预订,会返回0)。

Laravel Eloquent写法

如果你想在代码里用Eloquent实现这个逻辑,有两种简洁的方式:

方式1:使用子查询(selectSub)

这种写法和纯SQL逻辑一致,可读性强:

$teams = Team::select(['name', 'email', 'trial_ends_at'])
    ->selectSub(function ($query) {
        $query->selectRaw('COUNT(DISTINCT user_id)')
            ->from('bookings')
            ->whereColumn('bookings.team_id', 'teams.id');
    }, 'active_user_count')
    ->orderBy('trial_ends_at', 'desc')
    ->get();

方式2:使用左连接+分组

如果你的项目允许使用JOIN,这种方式也能实现,注意要在groupBy里包含所有非聚合字段(适配MySQL严格模式):

use Illuminate\Support\Facades\DB;

$teams = Team::select(
        'teams.name', 
        'teams.email', 
        'teams.trial_ends_at',
        DB::raw('COUNT(DISTINCT bookings.user_id) as active_user_count')
    )
    ->leftJoin('bookings', 'teams.id', '=', 'bookings.team_id')
    ->groupBy('teams.id', 'teams.name', 'teams.email', 'teams.trial_ends_at')
    ->orderBy('trial_ends_at', 'desc')
    ->get();

两种方式最终都会返回包含active_user_count字段的Team集合,完全满足你手动生成报表的需求。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.15 07:40:51