我正在尝试在两个日期范围之间选择数据。但是并非每天都插入所有数据。以下是该表的样本:
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-07-02到2012-07-04获得总出勤率。基于上面的数据,我将得到
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完成吗?我确实调查了temporary table。但仍无法实现目标。
答案 0 :(得分: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
以返回0
而不是NULL
。
答案 1 :(得分:0)
MySQL无法生成不存在的数据。如果您希望不存在日期,则需要一个包含您加入的完整日期范围的临时表。另一种方法是维护一个服务器端变量,并为每一行做一些日期数学,这很丑陋
select @dateval := '2012-07-02';
SELECT @dateval := @dateval + INTERVAL 1 DAY from ...
答案 2 :(得分: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中的关键字,我在这里使用它是为了提高可读性。使用不同的列名称。