sql - 在 PostgreSQL 查询中正确使用 TypeORM 上的 LEFT JOIN/ON/AND
问题描述
我试图将此查询转换为在 postgreSQL 上的 TypeORM
我的 PostgreSQL 查询:
SELECT project.status.name, COUNT(project.case."statusId") AS status
FROM project.status
LEFT JOIN project.case
ON project.case."statusId" = project.status.id AND
project.case."userId" = 1
GROUP BY project.status.name;
查询的结果返回给我状态值和零值:
statusName count
Open 1
Closed 0
我在 typeORM 上有这个,但这只会返回具有值的状态,并且我还想返回具有零值的状态。
const totalCases = this.caseRepository.createQueryBuilder('case')
.leftJoinAndSelect('case.status', 'status')
.leftJoinAndSelect('case.adminUser', 'adminUser')
.select('status.name')
.addSelect('COUNT(*) AS count')
.where('adminUser.user = :id ', { id: userId })
.groupBy('status.name')
.getRawMany()
return totalCases
我明白了:
[
{
"status_name": "Open",
"count": "1"
}
]
但我需要这个:
[
{
"status_name": "Open",
"count": "1"
},
{
"status_name": "Closed",
"count": "0"
}
]
解决方案
尝试从 开始statusRepository
,就像FROM
查询的子句以 开始project.status
:
statusRepository.createQueryBuilder('status')
.leftJoinAndSelect('status.cases', 'case')
.leftJoinAndSelect('case.adminUser', 'adminUser')
.select('status.name')
.addSelect('COUNT(*) AS count')
.where('adminUser.user = :id ', { id: userId })
.groupBy('status.name')
.getRawMany();
也许您首先需要cases
在实体内部定义为fromStatus
的反面 ( @OneToMany
) 。@ManyToOne
Case.status
您遇到的问题是,如果没有特定状态的案例,您将永远不会加入此状态case LEFT JOIN status
。因此,如果您从案例而不是状态开始,您的所有行都count = 0
不会出现。
推荐阅读
- javascript - 三.ObjectLoader:无法加载
- aws-lambda - 如何将无服务器框架创建的资源的 ARN 暴露给 Terraform
- javascript - immer - 嵌套生产调用未按预期工作
- emacs - 打开具有指定标题深度的组织文件
- docker - Kubernetes pod 内的 Internet 连接无法正常工作
- javascript - 如何使数据输入只读,但显示日历?
- python - 如何将数组作为多列添加到 pandas 的数据框中?
- python - 循环输入excel文件中的数据后如何为每次迭代生成新的excel文件
- javascript - 如何为第一个输入提供默认值?
- extjs - 在 Extjs 6.2.0 中添加大量目标时,拖动属性失效