mysql - 使用 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;
解决方案
您可以应用左连接并将您的 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查询
推荐阅读
- python - 套接字尝试连接异常
- google-apps-script - Gmail 自动回复脚本 - 如何设置条件时间并停止多个回复?
- docker - docker 卷中的文件未更新
- python - 当另一个选择小部件更改时,如何自动更新下拉选择小部件?(Python面板pyviz)
- css - 仅对 SVG 中的一条路径进行动画处理而不进行裁剪
- java - Wildfly 和 haproxy 之间的对话 - 无效的 PROXY 协议标头
- python - python-shapefile 将几何图形转换为纬度/经度
- java - 我怎样才能将一个名单平均分成 2 或 4 组并打印出来?
- php - 如何在 wordpress/PHP 上安全访问上传的文件
- java - 如何使用spring boot在rabbit mq中创建动态队列?