1

送信されたメールを追跡するテーブルがあります。とても簡単です。

ID | 日時| Eメール| 件名| メッセージ

私は数年前からデータを収集しています。テーブルにエントリがない日もあります。

query1:

SELECT COUNT(ID) FROM emails
WHERE DATE(datetime) >= 'XXXX-XX-XX'
AND DATE(datetime) is <= 'ZZZZ-ZZ-ZZ'
GROUP BY DATE(datetime)

次に、いくつかのphpを使用して、XXXXとYYYYの両方について1年前に取得し、最初のクエリと同じ2番目のクエリを実行します...

query2:

SELECT COUNT(ID) from emails
WHERE DATE(datetime) >= 'XXXX-XX-XX'
AND DATE(datetime) is <= 'ZZZZ-ZZ-ZZ'
GROUP BY DATE(datetime)

グラフパッケージを使用して、ある日付範囲で取得した電子メールの数を比較し、1年前に同じ範囲で取得した電子メールの数をオーバーレイします。これは現在2つのクエリであり、結果をグラフ化しています。

問題は、mysqlが問題の日に2011年の電子メールを持っていないが、同じ日に2012年にいくつかの電子メールを持っている場合です。

結果を組み合わせてグラフ化すると、その日の昨年の日付と0の値が欠落しているため、結果が歪んでしまい、事実上、すべての値が一致しなくなります。

2011-03-01 10    2012-03-01 4
2011-03-02 4     2012-03-02 2
2011-03-03 6     2012-03-04 1  <---- see where the two queries
                               end up diverging? (I had nothing
                               logged for 2012-03-03 so naturally
                               it was not in the results.

ある年に値が表示されるが別の年には表示されない日付を含む必要なデータをmysqlに出力させる方法はありますか、またはどちらの年にも値が表示されない場合(まだ日付と0が必要)、グラフが機能するようにする方法はありますか?

私はこれを行う方法を理解できないようです...

ありがとう!

4

1 に答える 1

2

連続する一連の日付の結果を取得するには、いくつかの方法があります。私のお気に入りは、ダミー テーブルまたは AI PK からの既存の連続した ID セットを使用して、必要な完全なセットを作成することです。このようなもの -

SELECT '2011-01-01' + INTERVAL (id -1) DAY
FROM dummy
WHERE id BETWEEN 1 AND 365

これにより、2011 年の完全な日のセットが返され、メール テーブルに LEFT JOIN してカウントを取得できます。

SELECT `dates`.`date`, COUNT(emails.id)
FROM (
    SELECT '2011-01-01' + INTERVAL (id - 1) DAY AS `date`, '2011-01-01 23:59:59' + INTERVAL (id - 1) DAY AS `end_of_day`
    FROM dummy
    WHERE id BETWEEN 1 AND 365
) `dates`
LEFT JOIN emails
    ON `emails`.`datetime` BETWEEN `dates`.`date` AND `dates`.`end_of_day`
GROUP BY `dates`.`date`

ダミー / seq テーブルに入力するには、最初の 10 個の値を手動で挿入してから、INSERT ... SELECT を使用して残りを追加します -

CREATE TABLE dummy (id INTEGER NOT NULL PRIMARY KEY);
INSERT INTO dummy VALUES (0),(1),(2),(3),(4),(5),(6),(7),(8),(9),(10);
SET @tmp := (SELECT MAX(id) FROM dummy) + 1;
INSERT INTO dummy
SELECT @tmp + id
FROM dummy;

INSERT ... SELECT クエリを実行するたびに、SET クエリを実行する必要があります。

于 2012-04-14T19:39:22.727 に答える