首页 > 解决方案 > 使用 groupBy 和 where 计算数据

问题描述

我要在这里四处走动,要说我认为这需要某种形式的加入才能完成,但无论如何这是我的问题。

我有一个数据集,该数据集当前按时期分组,然后检索这些时期中项目总数的计数。

P1 - 5、P2 - 3、P3 - 9 等。

我在要应用的同一数据集上有一个过滤器,但是,这会通过空的信息过滤掉任何组(显然数据不存在),但我仍然想将其计为 0。

数据集 2 示例:

P1 - 6, P2 - 0, P3 - 6

这是我当前的 group by 工作代码,用于在没有 0 个大小的组的情况下获取计数:

Model::select('period',DB::raw('count(*) as amount'))
    ->groupBy('period')
    ->get();

我想添加这样的内容:

->where('form', 'someformid')

我的猜测类似于 ->leftjoin('samemodelname', id = id) ,但我不确定。

如果那更容易,我可以转换 SQL 答案

编辑:

这是SQL

select DISTINCT claims.period, 
(select count(id) FROM claims as c1 where period = claims.period and c1.form=2) as amount
from claims;

标签: mysqllaravel

解决方案


您可以应用左连接并将您的 where 子句移动到该连接内

\App\Model::select(['period',DB::raw("count(*) as amount")])
    ->leftJoin(DB::raw("table2 as t2"), function ($join)  {
        $join->on('t2.id', '=', 'model.id');
        $join->on(function ( $query ){
            $query->whereNull('t2.id'); //this will make sure we also count the zero result of left join
            $query->orWhere('t2.form',someformid');
        });

    })
    ->groupBy('period')
    ->get();

像这样的东西。休息你可以分享SQL查询


推荐阅读