2011-02-04 1 views
4

logTimeという日付フィールドを持つログテーブルがあります。私は日付範囲内の行数と1日あたりのレコード数を表示する必要があります。問題は、私はまだにレコードがない日を表示したいということです。1日ごとにグループ化し、まだ行がない日を表示しますか?

これはSQLでのみ可能ですか?

例:私はあまりにも日2011-02-03を表示したいと思い

 
+---------------------+----------+ 
| logTime    | COUNT(*) | 
+---------------------+----------+ 
| 2011-02-01   |  2 | 
| 2011-02-02   |  1 | 
| 2011-02-04   |  5 | 
+---------------------+----------+ 
3 rows in set (0,00 sec) 

SELECT logTime, COUNT(*) FROM logs WHERE logTime >= '2011-02-01' AND logTime <= '2011-02-04' GROUP BY DATE(logTime);

それはこのような何かを返します。

答えて

5

これを達成するには、LEFT JOINを使用して結合できる日付を含むテーブル(または派生テーブル)が必要です。

SQLは数学的な集合の概念に基づいて動作し、データの集合を持たない場合はSELECTがありません。

詳細をご希望の場合は、適宜コメントしてください。

5

MySQLでは行が作成されないため、データが存在しない場合は当然表示されません。

あなたはカレンダーのテーブルを作成し、その中で参加することができ、

create table calendar (
    day date primary key, 
); 

塗りつぶし(ストアドプロシージャ、または単にいくつかの一般的なスクリプトで簡単に)日付で、このテーブル、アップ周り2038までと何か他のものでしょうおそらく問題になるブレークユニット。

あなたのクエリは、たとえば次のようになります。

SELECT logTime, COUNT(*) 
    FROM calendar cal left join logs l on cal.day = l.logTime 
WHERE day >= '2011-02-01' AND day <= '2011-02-04' GROUP BY day; 

さて、あなたは簡単に他の時間単位の統計情報を生成することができますので、あなたに、月、年、週などを伝えている他の列とカレンダーテーブルを拡張することができます。 (そして純粋主義者は、カレンダーテーブルに、日付の代わりにログテーブルが参照するID整数プライマリキーがあると主張するかもしれません)

+1

私はこれをほとんどの "正解"答え。 – gahooa

1

これはSQLで解決すべき問題かどうかはわかりません。他の人が示したように、これには、すべてのの時間間隔の個々の日付を含む第2のテーブルを維持する必要があります。時間間隔が拡大するたびに更新する必要があります。現在の時刻が

代わりに、あなたは、クエリの結果を点検し、必要に応じて日付を注入するために使用する必要がありますそれは完全に動的だと何の中間テーブルを必要としないあなたは何の言語を指定していないので、ここでは擬似コードだ:。。

EXECUTE QUERY `SELECT logTime, COUNT(*) FROM logs WHERE logTime >= '2011-02-01' AND logTime <= '2011-02-04' GROUP BY DATE(logTime);` 

FOREACH row IN query result 
    WHILE (date in next row) - (date in this row) > 1 day THEN 
    CREATE new row with date = `date in this row + 1 day`, count = `0` 
    INSERT new row IN query result AFTER this row 
    ADVANCE LOOP INDEX TO new row (`this row` is now the `new row`) 
    END WHILE 
END FOREACH 

またはそのようなもの

関連する問題