15

私はこのようなSQLを持っています( $ytoday5日前です):

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

これで毎日の値を返したいので、この場合は 5 つの結果が返されます (5 日前から今日まで)。

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

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

4

2 に答える 2

12

複雑な (私の意見では) クエリがなければ、出力データセットには、入力データセットに存在しない日付は含まれません。これは、結合する 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
于 2012-05-14T15:56:15.957 に答える
5

日付のリストに対して左結合する必要があります。必要な日付を含むテーブルを作成するか、ここで概説した動的なアプローチを取ることができます。

日付範囲から日を生成する

于 2012-05-14T15:55:56.253 に答える