当没有关系时,postgres内部连接总和

时间:2015-10-12 07:10:12

标签: ruby postgresql

我正在尝试运行一个简单的查询,其中我得到一些没有支持访问的园丁。我想补充其他案例,但首先我想把这件事做对。这就是我想出的:

Gardener.from(Gardener.joins(:support_visits).group(:gardener_id).select("CASE WHEN count(gardener_id) = 0 THEN 1 END AS zero_count"),:t).select("sum(t.zero_count) as tot_zero_count") 

这给了我以下sql查询:

SELECT sum(t.zero_count) as tot_zero_count
FROM
(
    SELECT CASE WHEN count(gardener_id) = 0 THEN 1 END AS zero_count
    FROM "gardeners" INNER JOIN "support_visits"
    ON "support_visits"."gardener_id" = "gardeners"."id"
    GROUP BY gardener_id
) t

查询运行但是我没有。

1 个答案:

答案 0 :(得分:0)

您当前的查询使用count(gardener_id) = 0,这是永远不会的,因为任何组都至少有一条记录。相反,您可以LEFT JOIN gardeners表到support_visits表。任何没有出现在support_visits表中的园丁都不会与访问匹配,只留下null值,然后您可以计算。

SELECT SUM(CASE WHEN "support_visits"."gardener_id" IS NULL THEN 1 ELSE 0 END) AS zero_count
FROM "gardeners" LEFT JOIN "support_visits"
ON "support_visits"."gardener_id" = "gardeners"."id"

以下是此查询的Ruby ActiveRecord代码:

Gardener.from(Gardener.joins("LEFT JOIN `support_visits` ON gardeners.id = support_visits.gardener_id").select("SUM(CASE WHEN "support_visits"."gardener_id" IS NULL THEN 1 ELSE 0 END) AS zero_count"))