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

Laravel Eloquent如何实现按电影ID分组统计总观影人次

实现方案

你当前的查询是按单场电影维度统计售票数,因此同一部电影对应多场放映时会出现重复的filme_id,要统计单部电影总观影人次,直接按电影ID分组聚合关联的票数据即可,无需嵌套子查询做二次求和。

原生SQL实现

用左关联可以兼容统计零售票的电影数据,仅需统计有售票记录的电影时将LEFT JOIN替换为INNER JOIN即可:

SELECT 
    s.filme_id,
    COUNT(b.id) AS total_viewers
FROM sessoes s
LEFT JOIN bilhetes b 
    ON b.sessao_id = s.id
GROUP BY s.filme_id
ORDER BY total_viewers DESC;

Laravel 查询构造器实现

直接调整分组维度为电影ID即可,不需要先按场次分组再二次处理:

$totalViewersPerFilm = DB::table('sessoes')
    ->select(
        'sessoes.filme_id',
        DB::raw('COUNT(bilhetes.id) as total_viewers')
    )
    ->leftJoin('bilhetes', 'bilhetes.sessao_id', '=', 'sessoes.id')
    ->groupBy('sessoes.filme_id')
    ->orderBy('total_viewers', 'desc')
    ->get();

扩展说明

如果需要同时统计单部电影的总场次、场均观影人次,可以直接在查询中追加聚合字段:

SELECT 
    s.filme_id,
    COUNT(b.id) AS total_viewers,
    COUNT(DISTINCT s.id) AS total_sessions,
    ROUND(COUNT(b.id)/COUNT(DISTINCT s.id),2) AS avg_viewers_per_session
FROM sessoes s
LEFT JOIN bilhetes b 
    ON b.sessao_id = s.id
GROUP BY s.filme_id

你原有代码的问题是分组维度设置为了sessao_id(场次ID),返回结果是单场售票数,自然会出现同一电影ID重复的情况,将分组维度调整为filme_id后直接计数关联的票记录,就能得到预期的单电影总观影人次结果。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.29 17:51:22