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

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

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

  1. {id, full_name, description, avatar_id, profile_id}

aldryn\u people\u person表:

  1. {id, phone, ...}

奥尔德林新闻博客文章:

  1. {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 .
目前是这样做的:

  1. SELECT main.*, sub.article_count
  2. FROM common_authorprofile AS main
  3. INNER JOIN aldryn_people_person
  4. ON aldryn_people_person.id = main.profile_id,
  5. LATERAL
  6. (SELECT author_id, COUNT(*) as article_count
  7. FROM aldryn_newsblog_article AS sub
  8. WHERE
  9. sub.author_id = aldryn_people_person.id AND
  10. sub.app_config_id = 1 AND
  11. sub.is_published IS TRUE AND
  12. sub.publishing_date <= now() AND
  13. aldryn_people_person.id = sub.author_id
  14. GROUP BY author_id
  15. ) AS sub

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

deikduxw

deikduxw1#

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

  1. with article_counts as (
  2. select author_id, count(*) as article_count
  3. from aldryn_newsblog_article
  4. where app_config_id = 1
  5. and is_published
  6. and publishing_date <= now()
  7. group by author_id
  8. )
  9. select prof.*, coalesce(ac.article_count, 0) as article_count
  10. from common_authorprofile prof
  11. left join article_counts ac
  12. on ac.author_id = prof.profile_id;

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

展开查看全部

相关问题