2

ある期間 (たとえば 1 週間) から登録数を取得したいのですが、これはそれほど難しいことではありませんが、MySQL で登録がない日にゼロを返すことができるかどうか疑問に思っていました。登録。

例: データ:

ID_Profile データ作成
1 2009-02-25 16:45:58
2 2009-02-25 16:45:58
3 2009-02-25 16:45:58
4 2009-02-26 10:23:39
5 2009-02-27 15:07:56
6 2009-03-05 11:57:30

SQL:

    選択する
        DAY(datCreate) を登録日として、
    COUNT(ID_Profile) as NumberOfRegistrations
    FROM tbl_profile
    WHERE DATE(datCreate) > DATE_SUB(CURDATE(),INTERVAL 9 DAY)
    GROUP BY 登録日
    ORDER BY datCreate ASC;

この場合、結果は次のようになります。

登録日登録数
25 3
26 1
27 1
5 1

明らかに、私はその間に数日行方不明です。現在、PHPコードでこれを解決していますが、MySQLが欠落している日/行に対して自動的に0を返す方法があるかどうか疑問に思っていました. これは望ましい結果です。

登録日登録数
25 3
26 1
27 1
28 0
1 0
2 0
3 0
4 0
5 1

このように、MySQL にはこの機能が組み込まれているため、毎月の日数を計算するために PHP コードに頼る代わりに、MySQL を使用して 1 か月の日数に関する問題を解決できます。

前もって感謝します

4

2 に答える 2

4

いいえ。ただし、回避策の1つは、日付の主キーを使用して単一列のテーブルを作成し、各日の日付をプリロードすることです。あなたはあなたの最も早い出発点からずっと遠い未来までの日付を持っているでしょう。

今、あなたはそれに対してあなたの統計データを左に結合することができます-そしてあなたはデータがないそれらの日のためにヌルを得るでしょう。nullではなくゼロが本当に必要な場合は、IFNULL(colname、0)を使用します。

于 2009-03-05T13:33:20.040 に答える
1

Paul Dixon のおかげで解決策が見つかりました。私がこれをどのように解決したかに興味がある人は誰でも読んでください:

最初に、どこかで見つけたストアド プロシージャを作成して、今年のすべての日付をテーブルに入力します。

CREATE Table calendar(dt date not null);

CREATE PROCEDURE sp_calendar(IN start_date DATE、IN end_date DATE、OUT result_text TEXT)
  始める
    SET @begin = 'INSERT INTO calendar(dt) VALUES';
    SET @date = start_date;
    SET @max = SUBDATE(end_date, INTERVAL 1 DAY);
    SET @temp = '';
    繰り返す
      SET @temp = concat(@temp, '(''', @date, '''), ');
      SET @date = ADDDATE(@date, INTERVAL 1 DAY);
      UNTIL @date > @max
    エンドリピート;
    SET @temp = concat(@temp, '(''', @date, ''')');
    SET result_text = concat(@begin, @temp);
  終わり


   call sp_calendar('2009-01-01', '2010-01-01', @z);

   @z を選択します。

次に、左結合を追加するようにクエリを変更します。

選択する
    DAY(dt) を登録日として、
    COUNT(ID_Profile) as NumberOfRegistrations
FROMカレンダー
左結合
    tbl_profile ON calendar.dt = tbl_profile.datCreate
WHERE dt BETWEEN DATE_SUB(CURDATE(),INTERVAL 6 DAY) AND CURDATE()
GROUP BY 登録日
注文順 dt ASC

これで完了です。

迅速な返信と解決策をありがとう。

于 2009-03-05T14:46:04.967 に答える