2012-03-29 3 views
0

は、以下の「メッセージ」の表を考えてみましょう:データベースにレコードが存在しないMySQLの結果に日付を追加するにはどうすればよいですか?

_date  message 
------------------------- 
2012-02-22 hello 
2012-02-22 another msg! 
2012-03-05 foobar 
2012-03-22 testing 
2012-03-22 goodbye 
2012-03-22 test test 

私は一日あたりのメッセージ数をカウントするだけでなく、すべての日れているメッセージがないを含めたいです。私は2012年2月1日と2012年3月29日の間のすべてのメッセージをカウントしたいとし、その後、クエリの結果は次のようになります。

_date  messsages 
---------------------- 
2012-02-01 0 
2012-02-02 0 
... 
2012-02-22 2 
2012-02-23 0 
... 
2012-03-01 0 
2012-03-02 0 
2012-03-03 0 
2012-03-04 0 
2012-03-05 1 
... 
2012-03-22 3 
... 
2012-03-29 0 

は、MySQLの中、このことは可能ですか?

+1

レコードに日付がない場合、2012-02-01と2012-03-29の間の日付はどのようになっているのですか? – Curt

答えて

2

何か -

SELECT date_range.`date`, COUNT(messages._date) 
FROM (
    SELECT '2012-02-01' + INTERVAL (id - 1) DAY AS `date` 
    FROM dummy 
    WHERE id BETWEEN 1 AND 58 
    ORDER BY id ASC 
) AS date_range 
LEFT JOIN messages 
    ON date_range.`date` = messages._date 
GROUP BY date_range.`date` ASC 

この例ダミーについては、必要な日付範囲をカバーする連続セットと整数ベースidフィールドを持つ任意のテーブルです。この場合は、1から58までのidsが必要です。

0

hereのように、範囲内のすべての日付のテンポラリテーブルを作成し、それにメッセージテーブルを結合するストアドプロシージャを使用する必要があります。それらを持たないテーブルからレコードを返すことはできません。それを行う必要があり、このような

0

私はここで別の答えにキーワードBETWEENを使って、おそらく同様の解決策を見つけました。私は個人的に以前はSQLでBETWEENを使用していませんでしたが、有望です。テーブルに存在しない日数が0になるかどうかは分かりませんが、それはあなたが少なくともatleastを始められるかもしれません。

また、JOINに対して使用する「ヘルパー」テーブルを持つ醜い方法についても言及しています。これは間違いなく0カウントを得るだろうが、私の意見ではちょっと混乱しているだろう。あなたがそのルートに行くことを決めた場合、私はテンポラリテーブルの作成を試みることをお勧めします。

https://stackoverflow.com/a/895185/1301139

+0

BETWEEN xとyは別の書き込み方法です(a> = x AND a <= y) - [比較関数と演算子](http://dev.mysql.com/doc/refman/5.0/en/comparison -operators.html#operator_between) – nnichols

0

あなたは、多くの場合、またはあなたがしたくない(またはすることはできません)に加入左に新しいテーブルを作成する場合、あなたはこの中でsteted動的にデータを生成することができ、このクエリを実行していない場合question

関連する問題