如何计算postgres中的多个联接行?

dea*_*908 1 postgresql join

我有4张桌子:A,B,C,D。

  • 表B具有A的外键
  • 表C具有A的外键
  • 表D具有C的外键 在此处输入图片说明

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

  • 我知道如何从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"
Run Code Online (Sandbox Code Playgroud)

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

McN*_*ets 7

由于您要加入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"
Run Code Online (Sandbox Code Playgroud)