0

2つの日付範囲のデータを選択しようとしています。ただし、すべてのデータが毎日挿入されているわけではありません。以下は表のサンプルです。

mysql> SELECT * FROM attendance;
+------------+-------+
| date       | total |
+------------+-------+
| 2012-07-02 |   100 |
| 2012-07-04 |    70 |
| 2012-07-05 |    78 |
+------------+-------+
3 rows in set (0.00 sec)

シナリオは、2012年7月2日から2012年7月4日までの合計出席者数を取得したいというものです。上記のデータに基づいて、

mysql> SELECT * FROM attendance WHERE date BETWEEN '2012-07-02' AND '2012-07-04';
+------------+-------+
| date       | total |
+------------+-------+
| 2012-07-02 |   100 |
| 2012-07-04 |    70 |
+------------+-------+
2 rows in set (0.00 sec)

ただし、私の目的は、2012-07-03を結果に含めることです。

+------------+-------+
| date       | total |
+------------+-------+
| 2012-07-02 |   100 |
| 2012-07-03 |     0 |
| 2012-07-04 |    70 |
+------------+-------+

これはMySQLを介して実行できますか?一時テーブルを調べました。しかし、それでも目的を達成することはできません。

4

3 に答える 3

1

日付を派生した疑似テーブル(を使用してUNION)として列挙し、それをデータと結合することができます

SELECT dates.date, COALESCE(attendance.total,0) AS total FROM (
SELECT '2012-07-02' AS date
UNION ALL SELECT '2012-07-03'
UNION ALL SELECT '2012-07-04'
) AS dates
LEFT JOIN attendance USING(date)

編集:欠落しているレコードではなく、COALESCE戻るように追加されました。0NULL

于 2012-07-05T05:35:34.803 に答える
0

MySQLはそこにないデータを生成できません。存在しない日付が必要な場合は、参加する日付範囲全体を含む一時テーブルが必要になります。もう1つの方法は、サーバー側の変数を維持し、行ごとに日付の計算を行うことです。これは醜いです。

select @dateval := '2012-07-02';
SELECT @dateval := @dateval + INTERVAL 1 DAY from ...
于 2012-07-05T04:40:19.337 に答える
0

これは、単純な解決策でよくある問題です。

REF_DATE などの通常のテーブルを作成し、3 年間または必要な期間のすべての日付を格納します。

次に、このテーブルを左側に使用しますLEFT OUTER JOIN

SELECT REF.date,IFNULL(A.total,0) as total FROM REF_DATE REF 
LEFT OUTER JOIN attendance 
ON REF.date=A.date
A WHERE REF.date BETWEEN '2012-07-02' AND '2012-07-04';

DATE は MySQL のキーワードです。読みやすくするためにここで使用しています。別の列名を使用してください。

于 2012-07-05T05:59:13.540 に答える