为子查询优化Postgresql查询

问题描述 投票:0回答:1

我对Postgres来说还很陌生,这可能是一个新手问题。如何改善此查询?

三个表,campaigns 1-> Mthreads1-> M messages。我有广告系列ID,我希望所有线程的所有相关消息的总数分别为opensclicksreplies,其中opensclicks在名为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"
sql postgresql query-performance postgresql-performance
1个回答
0
投票

您可以进行窗口计数:

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"
© www.soinside.com 2019 - 2024. All rights reserved.