2012-05-14 10 views
10

私はこのようなSQL($ytodayは5日前である場合)があります。それは(今日まで、5日前)、この場合には5件の結果を返しますので、私は、これは毎日の値を返すようにしたいGROUP BYとCOUNTにゼロ合計を含めるにはどうすればよいですか?

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

を。

しかし、Count(*)は昨日は0ですが、ゼロを返す代わりに、その日付のデータはまったく返されません。

このSQLiteクエリを変更して、カウントが0のデータも返すようにするにはどうすればよいですか?

+0

(左おそらく参加)これらの行で、カウントを実行し、あなたが最初にしたいすべての行を選択し – keyser

答えて

9

コンボリューション(私の意見では)クエリがなければ、あなたの出力データ・セットは、」勝ちました入力データセットに存在しない日付が含まれています。つまり、参加するには5日間のデータセットが必要です。

単純なバージョンでは、5つの日付のテーブルを作成し、それに参加することになります。私は通常、作成し、(効果的にキャッシュ)を維持する私はこれまでに必要なすべての日付を持つカレンダーテーブル。 (このような2099年12月31日まで1900年1月1日からのような。)

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句を変更するだけです。たとえば、私は怠け者で、WHERE句で5日の範囲を指定していないため、「2012-05-01」以降のすべての日付を表示します。それでは、あなたがすでに行っているようにして、WHERE句をあなたのニーズに合わせて構築します。 – MatBailie

+0

まあまあです。私は '5つの日付を持つテーブルを作成する 'とは、5つのエントリだけを持つテーブルを作成することを意味すると考えました。 – JBurace

4

日付のリストに対して左にジョインする必要があります。あなたはそれに必要な日数を持つテーブルを作成することができますか、あなたは私がここで説明するダイナミックなアプローチを取ることができます。

generate days from date range

関連する問題