我对Postgres来说还很陌生,这可能是一个新手问题。如何改善此查询?
三个表,campaigns
1-> Mthreads
1-> M messages
。我有广告系列ID,我希望所有线程的所有相关消息的总数分别为opens
,clicks
和replies
,其中opens
和clicks
在名为extra
的JSONB字段中, messages
和答复是具有messages
列的"direction"='received'
。
select "threads".*,
count("messages"."extra"->'opens') as opens,
count("messages"."extra"->'clicks') as clicks,
(
select count("messages"."id")
from "messages"
where "messages"."thread_id" = "threads"."id"
and "messages"."direction"='received'
) as replies
from "threads"
inner join "messages"
on "messages"."thread_id" = "threads"."id"
where "threads"."campaign_id"
in ('campaign_uuid')
group by "threads"."id"
您可以进行窗口计数:
select "threads".*,
count("messages"."extra"->'opens') as opens,
count("messages"."extra"->'clicks') as clicks,
count(*)
filter(where "messages"."direction"='received')
over(partition by "threads"."id") as replies
from "threads"
inner join "messages"
on "messages"."thread_id" = "threads"."id"
where "threads"."campaign_id"
in ('campaign_uuid')
group by "threads"."id"