2016-01-14 76 views
1

我無法理解嵌套查詢。我有一個評論表和一個帖子表,我想計算給定網站給定日期範圍內的評論數量。這部分我可以做得很好,但如果在日期範圍內沒有對這些日期之一進行評論,那麼它只是跳過它。在Postgres中嵌套或引用查詢

因此,我發現了一個查詢,它構建了完整的日期範圍並計算了相應的註釋數量。

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,但我不能得到那個工作,同時仍保持完整的日期範圍不變。在以下的職位表因素的查詢,但擺脫了日期

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

如果使用也許會更容易[CTE的(http://www.postgresql.org/docs/9.1/static/queries-with.html)如果你已經有一個查詢工作命名CTE並在第二個查詢中使用它。 CTE的工作原理與子查詢完全相同,但易於閱讀,並且可以重複使用。 –

回答

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