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
相关产品推荐
相关产品推荐

