【发布时间】:2016-04-20 05:29:44
【问题描述】:
我无法理解嵌套查询。我有一个 cmets 表和一个 posts 表,我想计算给定站点在给定日期范围内的 cmets 数量。这部分我可以做得很好,但如果日期范围内的其中一个日期没有 cmets,那么它就会跳过它。
所以我找到了一个查询,该查询构建了完整的日期范围并计算了 cmets 的数量。
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;
现在这会返回我想要的部分内容,但当然不会不考虑帖子表。
date count
2016-01-11 2
2016-01-12 0
....
2016-01-07 1
所以我知道count(comm.id) 需要引用inner join 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
那么有没有正确的方法来组合这些查询?我不明白如何引用内部连接结果。任何帮助,将不胜感激。谢谢。
【问题讨论】:
-
如果您使用CTE's 可能会更容易如果您已经在 CTE 上有一个查询工作名称并将其用于第二个查询。 CTE 与子查询完全一样,但更易于阅读,您可以重复使用它。
标签: sql database postgresql join nested