在 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
我无法理解嵌套查询。我有一个评论 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