在 Postgres 中嵌套或引用查询

Nesting or Referencing Queries in Postgres

我无法理解嵌套查询。我有一个评论 table 和一个帖子 table,我想计算给定网站在给定日期范围内的评论数。这部分我可以做得很好,但是如果日期范围内的其中一个日期没有评论,那么它就会跳过它。

所以我找到了一个构建完整日期范围并计算评论数量的查询。

SELECT drange.date, count(comm.id)
FROM
    (
        SELECT to_char(date_trunc('day', (current_date - offs)), 'YYYY-MM-DD') AS date 
        FROM generate_series(1, 7, 1) AS offs
    ) drange
    LEFT OUTER JOIN
    comments comm ON (
        drange.date=to_char(date_trunc('day', comm.created_at), 'YYYY-MM-DD')
    ) 
GROUP BY drange.date;

现在这个 returns 部分是我想要的,但当然不考虑帖子 table。

date         count
2016-01-11   2
2016-01-12   0
....
2016-01-07   1

所以我知道 count(comm.id) 需要引用 inner join posts,但我无法在保持完整日期范围不变的情况下使其正常工作。下面的查询将帖子 table 中的因素考虑在内,但去掉了其余的日期

SELECT drange.date, count(comm.id)
FROM
    (
      SELECT to_char(date_trunc('day', (current_date - offs)), 'YYYY-MM-DD') AS date 
      FROM generate_series(1, 7, 1) AS offs
    ) drange
    LEFT OUTER JOIN comments comm ON (
        drange.date=to_char(date_trunc('day', comm.created_at), 'YYYY-MM-DD')
    )
    INNER JOIN
    posts ON (comm.post_id = posts.id) 
WHERE posts.site_id = 35
GROUP BY drange.date;

Returns:

date        count
2016-01-07  1

那么有没有正确的方法来组合这些查询呢?我不明白如何引用内部联接结果。任何帮助,将不胜感激。谢谢。

首先将日期范围系列移动到table 表达式的右侧。其次将 where 条件移动到 join 条件。这两个步骤都将避免在您的查询中发生空值排除。

select g.d, count(c.id)
from
    comments c 
    inner join
    posts p on c.post_id = p.id and p.site_id = 35
    right join
    generate_series (
        current_date - 7, current_date, '1 day'
    ) g(d) on g.d = date_trunc('day', c.created_at)
group by g.d