我无法理解嵌套查询。我有一个评论表和一个帖子表,我想计算给定网站的给定日期范围内的评论数量。这部分我可以做得很好,但是如果日期范围内的其中一个日期没有评论,那么它就会跳过它。
所以我找到了一个构建完整日期范围的查询,并根据该查询计算注释数。
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
那么是否有正确的方法来组合这些查询?我不明白如何引用内连接结果。任何帮助,将不胜感激。感谢。
答案 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