0

次の「メッセージ」テーブルを検討してください。

_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

1 日あたりのメッセージ数をカウントしたいが、メッセージがない日もすべて含めたい。2012-02-01 から 2012-03-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 内で可能ですか?

4

4 に答える 4

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 までの ID が必要です。

于 2012-03-29T15:32:30.880 に答える
0

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

また、JOINに対して使用する「ヘルパー」テーブルを持つという醜い方法についても言及しています。これは間違いなくあなたに0カウントを与えるでしょうが、私の意見ではちょっと厄介でしょう。そのルートを選択する場合は、CREATETEMPORARYTABLEを使用して一時テーブルを試すことをお勧めします。

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

于 2012-03-29T15:41:53.707 に答える
0

このクエリを頻繁に実行しない場合、または左結合する新しいテーブルを作成したくない(または作成できない)場合は、この質問で説明したようにデータを動的に生成できます。

于 2012-03-29T15:42:40.913 に答える
0

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

于 2012-03-29T15:31:44.873 に答える