postgresql - 如何计算 postgres 中的多个连接行?

标签 postgresql join

我有 4 个表:A、B、C、D。

  • 表B有A的外键
  • 表C有A的外键
  • 表 D 有 C 的外键 enter image description here

到目前为止我可以查询的内容:

  • 我知道如何从 A 中选择所有行并计算 B 中连接行的数量。
  • 我知道如何选择 A 中的所有行并计算 D 中连接的行的数量(通过 C)。

现在我想将这两个查询合并到一个选择中,并在那里显示 count_b 和 count_d。但是生成的选择显示错误的计数。以下是我的做法:

SELECT
  "A"."id",
  COUNT("B"."id") AS "B_count",
  COUNT("D"."id") AS "D_count"
FROM "users" AS "A" LEFT OUTER JOIN "B" AS "B"
    ON "A"."id" = "B"."a__id"
  LEFT OUTER JOIN "C" AS "C"
    ON "A"."id" = "C"."a_id"
  LEFT OUTER JOIN "D" AS "D"
    ON "C"."id" = "D"."c_id"
GROUP BY "A"."id"

GROUP BY 可能存在问题。看来我需要为每个计数编写单独的分组依据。我正在寻找没有嵌套选择的结果(因为我仍然需要将其映射到 ORM,不要问为什么)。是否可以使用 distinct by 进行归档?

最佳答案

由于您要连接 3 个表,因此您应该在 COUNT 中使用 DISTINCT:

SELECT
  "A"."id",
  COUNT(DISTINCT "B"."id") AS "B_count",
  COUNT(DISTINCT "D"."id") AS "D_count"
FROM "users" AS "A" LEFT OUTER JOIN "B" AS "B"
    ON "A"."id" = "B"."a__id"
  LEFT OUTER JOIN "C" AS "C"
    ON "A"."id" = "C"."a_id"
  LEFT OUTER JOIN "D" AS "D"
    ON "C"."id" = "D"."c_id"
GROUP BY "A"."id"

关于postgresql - 如何计算 postgres 中的多个连接行?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43073223/

相关文章:

python - Pandas:加入部分字符串匹配,如 Excel VLOOKUP

PostgreSQL - 恢复后的数据库比原始数据库小

postgresql - 如何根据 uuid 数组从用户中进行选择?

postgresql - SELECT AS colName in inner join, colName 不存在 (Postgres)

postgresql - 在 PostgreSQL 中获取下一个可用的 auto_increment ID - 更好的方法?

mysql - 将具有索引的大表与小表连接起来

mysql - 连接查询中的重复结果

database - 将 RDS Postgres 与 Heroku 一起使用有多安全?

mysql JOIN 当一张表没有条目时

sql - TSQL 返回存在的内容