我们平时在操作数据库的时候,对于null的记录或者字段相信大家都可以用ifnull()来判断为null的时候需求返回什么数据,但是如果根据条件查询的时候,数据库根本没有这条记录但是又想返回数据不存在时候的结果该怎么办,比如你统计一个时间区间的某条记录中的一个字段,如果记录不存在就是0,ifnull()这个函数是在字段为null的情况才可以判断,那么这个时候改怎么判断呢?
示例:
SELECT check_date,sum(cnt) cnt FROM db58_baicai_bcbi.v_check_count_day WHERE sync_is_valid = 0 AND check_date BETWEEN '2022-02-01' and '2022-02-08' GROUP BY check_date
这是原来的sql,查询条件为时间,并且按照时间分组统计cnt的字段之和.
结果
这里可以看到由于其他区间没有记录所以统计不出来条数,那如果我们场景是作为一个折线图的数据,那么其他日期区间没有记录的应该用0表示,这时候该怎么做呢?
我们这时候可以新建一张只存时间的表,然后将结果leftjon,这样如果cnt数据没有就会为null,这个时候就可以用ifnull()来判断了,当日这种方式比较暴力而且时间可能会不够,所以一次生成了50年的,之前也试过用存储方式来写,但是我觉得这种比较简单,sql也不会复杂,不知道有没有大佬有更好意见
SELECT
daylist.DAY,
IFNULL( sum( cnt ), 0 ) AS cnt
FROM
db58_baicai_bcbi.v_day_list daylist
LEFT JOIN ( SELECT check_date, sum( cnt ) cnt FROM db58_baicai_bcbi.v_check_count_day WHERE sync_is_valid = 0 AND check_date BETWEEN '2022-02-01' AND '2022-02-08' GROUP BY check_date ) countday ON daylist.DAY = countday.check_date
WHERE
daylist.DAY BETWEEN '2022-02-01' AND '2022-02-08'
GROUP BY
daylist.DAY
日期表:
结果