【问题标题】:Nesting or Referencing Queries in Postgres在 Postgres 中嵌套或引用查询
【发布时间】: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


【解决方案1】:

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

【讨论】:

    猜你喜欢
    • 2023-04-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-03-14
    • 2017-01-28
    • 2023-04-03
    • 1970-01-01
    相关资源
    最近更新 更多