用MySQL选择不存在的数据

时间:2012-07-05 04:37:41

标签: mysql select

我正在尝试在两个日期范围之间选择数据。但是并非每天都插入所有数据。以下是该表的样本:

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。但仍无法实现目标。

3 个答案:

答案 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中的关键字,我在这里使用它是为了提高可读性。使用不同的列名称。