首页 > 解决方案 > 在 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"
    }
]

标签: sqlpostgresqlnestjstypeorm

解决方案


尝试从 开始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) 。@ManyToOneCase.status

您遇到的问题是,如果没有特定状态的案例,您将永远不会加入此状态case LEFT JOIN status。因此,如果您从案例而不是状态开始,您的所有行都count = 0不会出现。


推荐阅读