我的数据结构如下,表名用粗体字表示,相关列名如下。
公共授权配置文件:
{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
我的问题有两个:
考虑到表的关系,这是正确的方法吗?
这是一种有效的方法吗?也就是说,有没有一种方法可以提高它的速度和可读性?
1条答案
按热度按时间deikduxw1#
滴水
aldryn_people_person
混合使这个更容易阅读。为了可读性,我也更喜欢公共表表达式而不是子查询或横向联接,但是cte会减慢执行速度。我只在速度有问题的情况下重构。
我会这样处理:
这个
left outer join
给你买了所有的东西common_authorprofile
记录。这个coalesce()
显示列表中缺少的行article_counts
cte组件0
. 你可以改变主意left join
为了公正join
如果那不是你想要的。如果您有任何问题,请发表意见。