我有下表:
administratieID | varchar
getalTypeNaam | varchar
datum | date
waarde | double
使用以下查询:
Select administratieID AS AI, waarde WA, datum DT
from getalType
where getalTypeNaam = 'test'
and datum between DATE_SUB(NOW(), INTERVAL 10 DAY) and DATE_SUB(NOW(), INTERVAL 15 DAY)
order by datum
我想要的是,我可以选择返回指定日期之间的所有日期,即使数据库中没有任何与该日期对应的日期。即使没有值,我也想要这个,但在这种情况下,我想返回值 0。
所以我想要这个作为回报:
date administratieID waarde
10-10-2016 xxx 10
11-10-2016 xxx 0 <-- no data available
12-10-2016 xxx 40
13-10-2016 xxx 9
14-10-2016 xxx 0 <-- no data available
现在我明白了:
date administratieID waarde
10-10-2016 xxx 10
12-10-2016 xxx 40
13-10-2016 xxx 9
有一些方法可以做到这一点,但它们非常黑客......
一种是使用内联递增变量,并使用您知道其中的记录数至少与日期范围内的最大天数一样多的虚拟表。然后你可以做这样的事情:
SET @date = DATE_SUB(NOW(), INTERVAL 15 DAY); #or whatever the earliest date you need is
SELECT DISTINCT
IFNULL(administratieID,'XXX') AS AI
, IFNULL(waarde,0) AS WA
, all_dates AS DT
FROM
(SELECT @date:=DATE_ADD(@date, INTERVAL 1 DAY) AS all_dates
FROM
my_dummy_table_with_lots_of_records
WHERE @date >= DATE_SUB(NOW(), INTERVAL 15 DAY) AND @date <= DATE_SUB(NOW(), INTERVAL 10 DAY)) d LEFT JOIN
getalType t ON
DATE_FORMAT(all_dates,'%Y-%m-%d') = DATE_FORMAT(t.datum,'%Y-%m-%d')
WHERE
IFNULL(getalTypeNaam, 'Test') = 'Test' #if there's no data we still need to return something
ORDER BY all_dates;
另一种更简单的方法是拥有一个名为"all_dates"的表,您可以在连接中使用它。该表只有一列"datum",您可以使用可以在getalType表中使用的每个可能的日期填充它。这甚至可以通过触发器来完成。
然后你链接到这个表,而不是做上面所有派生的废话。
这也将避免必须有多个 sql 语句,因为您没有需要初始化的变量。