2012-05-14 63 views
10

我有這樣的SQL(其中$ytoday是5天前):如何讓GROUP BY和COUNT包含零和?

$sql = 'SELECT Count(*), created_at FROM People WHERE created_at >= "'. $ytoday .'" AND GROUP BY DATE(created_at)'; 

我想這對於每天返回一個值,所以它會在這種情況下返回5個結果(5天前到今天) 。

但是,說Count(*)是昨天0,而不是返回一個零它不會返回任何數據在該日期。

如何更改該SQLite查詢,使其也返回計數爲0的數據?

+0

選擇所有你想先行,然後運行在這些行的計數(左連接也許) – keyser

回答

9

無曲(在我看來)查詢,您的輸出數據集贏得」 t包含輸入數據集中不存在的日期。這意味着你需要一個5天的數據集來加入。

簡單的版本將創建一個表與5日期,並加入。我通常創建並保持(有效緩存)日曆表,包含我需要的每個日期。 (比如從1900-01-01到2099年12月31日。)

SELECT 
    calendar.calendar_date, 
    Count(People.created_at) 
FROM 
    Calendar 
LEFT JOIN 
    People 
    ON Calendar.calendar_date = People.created_at 
WHERE 
    Calendar.calendar_date >= '2012-05-01' 
GROUP BY 
    Calendar.calendar_date 
+0

嗯,看起來很簡單足夠。儘管這總是最後5天,所以靜態表不起作用。思考? – JBurace

+0

@JBurace - 一個靜態表確實有效。你只需改變你的WHERE子句。例如,我會顯示「自2012-05-01'之後的每一個日期」,因爲我很懶,並沒有在那個WHERE子句中指定5天的範圍。然後,按照您的要求進行操作,並根據您的需求構建WHERE子句。 – MatBailie

+0

嗯沒關係。我以爲'用5個日期創建一個表'意味着創建一個只有5個條目的表格。 – JBurace