2012-09-02 47 views
2

之間的所有日期我不是一個數據庫專家。我只是在製作一個項目,我們需要每天在日曆中顯示用戶選擇的兩個日期之間的頁面瀏覽量。我已經帶來以下適用於派生表和萬年曆錶右連接獲得2天

SQL查詢就會像

SELECT DATE_FORMAT(created_at,'%d %b %Y') as this_date, count(*) as Views 
from promotion_insights WHERE f_id = '2' AND p_id = '12' 
AND created_at BETWEEN '2012-08-15' AND '2012-08-19' 
GROUP BY this_date 

結果的頁面訪問量總數的到來猶如

---------------------- 
this_date View 
--------------------- 
15 Aug 2012  3 
16 Aug 2012  2 
---------------------- 

我還有萬年曆錶和存儲procedure.calendar表有一列名爲(datefield)的日期。我已經通過調用存儲過程生成日期,所以不用擔心。現在我想要的,就是讓最新的基礎上右連接到具有高於表(this_date和視圖列)與日曆表由用戶選擇,並具有0次日期把0之間展現all_dates。 COUNT(*)也由returing 1改爲0

預期輸出的加入我要製造麻煩是這樣的:

---------------------- 
this_date View 
--------------------- 
15 Aug 2012  3 
16 Aug 2012  2 
17 Aug 2012  0 
18 Aug 2012  0 
19 Aug 2012  0 

---------------------- 

任何幫助將非常高度讚賞。

+1

爲什麼你在SQL,而不是在你的應用程序,其中從一個日期循環到另一個是微不足道的這樣做呢? –

回答

1

您可以使用日曆表輕鬆做到這一點 - 這是大多數數據庫的一個好主意。

SELECT DATE_FORMAT(c.date,'%d %b %Y') as this_date, count(*) as Views 
from calendar c left outer join 
    promotion_insights pi 
    on c.date between '2012-08-15' AND '2012-08-19' and 
     c.date = pi.created_at 
WHERE f_id = '2' AND p_id = '12' 
GROUP BY c.date 

注意:這裏假定created_at存儲爲日期而不是日期時間。有時間組件可能會導致比較失敗。

0

如果你想這樣做,在SQL你需要一個排發生器產生連續的每一天在你的日期範圍,然後再加入您的查詢所產生的行,得到的結果爲每一天在你的日期範圍(甚至如果在該範圍內某天沒有數據存在)。

如果您使用的是Oracle,你可以使用ALL_OBJECTSDUAL生成行。由於您在查詢中使用DATE_FORMAT,因此您似乎使用MySQL。 how to make a row generator in MySQL之前發佈了一個問題。它聲稱:

討厭這麼說,但MySQL是唯一沒有此功能的四大關係型數據庫管理系統。

+0

謝謝你們的幫助...... –