在Postgres中嵌套或引用查询

时间:2016-01-14 18:35:56

标签: sql database postgresql join nested

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

所以我找到了一个构建完整日期范围的查询,并根据该查询计算注释数。

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;

现在这会返回我想要的部分内容,但当然不会在posts表中进行考虑。

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

所以我知道count(comm.id)需要引用inner join posts,但是我仍然无法在保持完整日期范围完整的情况下继续工作。下面的查询在posts表中的因素,但摆脱了其余的日期

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;

返回:

date        count
2016-01-07  1

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

1 个答案:

答案 0 :(得分:0)

首先将日期范围系列移动到表格表达式的右侧。第二步将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