postgres横向查询的正确性和效率

8yoxcaq7  于 2021-07-27  发布在  Java
关注(0)|答案(1)|浏览(380)

我的数据结构如下,表名用粗体字表示,相关列名如下。
公共授权配置文件:

{id, full_name, description, avatar_id, profile_id}

aldryn\u people\u person表:

{id, phone, ...}

奥尔德林新闻博客文章:

{id, is_published, is_featured, ..., author_id}

值得注意的是 common_authorprofile.profile_id = aldryn_people_person.id 以及 aldryn_newsblog_article.author_id = aldryn_people_person.id 我试图计算每个实体的文章数量 common_authorprofile .
目前是这样做的:

SELECT main.*, sub.article_count
FROM common_authorprofile AS main
INNER JOIN aldryn_people_person
ON aldryn_people_person.id = main.profile_id,
LATERAL 
    (SELECT author_id, COUNT(*) as article_count
     FROM aldryn_newsblog_article AS sub
     WHERE
            sub.author_id = aldryn_people_person.id   AND
            sub.app_config_id = 1            AND
            sub.is_published IS TRUE         AND
            sub.publishing_date <= now()     AND
        aldryn_people_person.id = sub.author_id 
     GROUP BY author_id
    ) AS sub

我的问题有两个:
考虑到表的关系,这是正确的方法吗?
这是一种有效的方法吗?也就是说,有没有一种方法可以提高它的速度和可读性?

deikduxw

deikduxw1#

滴水 aldryn_people_person 混合使这个更容易阅读。
为了可读性,我也更喜欢公共表表达式而不是子查询或横向联接,但是cte会减慢执行速度。我只在速度有问题的情况下重构。
我会这样处理:

with article_counts as (
  select author_id, count(*) as article_count
    from aldryn_newsblog_article
   where app_config_id = 1
     and is_published
     and publishing_date <= now()
   group by author_id
)
select prof.*, coalesce(ac.article_count, 0) as article_count
  from common_authorprofile prof
       left join article_counts ac
              on ac.author_id = prof.profile_id;

这个 left outer join 给你买了所有的东西 common_authorprofile 记录。这个 coalesce() 显示列表中缺少的行 article_counts cte组件 0 . 你可以改变主意 left join 为了公正 join 如果那不是你想要的。
如果您有任何问题,请发表意见。

相关问题