最近公司在作統計,前端使用了ECHART,須要有7天的數據結果,後臺調度數據的話使天天晚上0點一刻跑昨天一天的數據彙總。可是若是使新的數據,就不會有7天的數據可查。因此怎麼構建空的統計數據給前端呢。html
因爲本人sql能力水平真的不好(這段時間要多增強),在百度和google了一大會以後,發現了兩個不錯的給了我思路的blog:前端
1.http://www.cnblogs.com/jethypc/p/5065857.htmlsql
2.https://segmentfault.com/q/1010000006663965segmentfault
在 查詢過去N天數據的時候,可使用adddate()函數 和 CROSS
JOIN
查詢。函數
1.建立基礎表:google
CREATE TABLE num (i INT); INSERT INTO num (i) VALUES (0),(1),(2),(3),(4),(5),(6),(7),(8),(9);
2.查詢時間範圍code
SELECT adddate('2015-11-25', numlist.id) AS 'date' FROM ( SELECT n1.i + n10.i * 10 + n100.i * 100 AS id FROM num n1 CROSS JOIN num AS n10 CROSS JOIN num AS n100 ) AS numlist WHERE adddate('2015-11-25', numlist.id) <= '2015-12-25';
3 建立數據表htm
create table datatable(tDate char(10) PRIMARY KEY,tCount int(3)); insert into datatable(tDate,tCount)values ('2015-11-24',23),('2015-11-25',1), ('2015-11-26',21),('2015-11-28',17), ('2015-11-29',13),('2015-12-01',5), ('2015-12-02',11),('2015-12-04',8), ('2015-12-05',3),('2015-12-07',29), ('2015-12-09',80),('2015-12-10',24)
4 查詢 (無值時補零)blog
SELECT a.date, COALESCE (b.tcount, 0) count FROM ( SELECT adddate('2015-11-25', numlist.id) AS 'date' FROM ( SELECT n1.i + n10.i * 10 + n100.i * 100 AS id FROM num n1 CROSS JOIN num AS n10 CROSS JOIN num AS n100 ) AS numlist WHERE adddate('2015-11-25', numlist.id) <= '2015-12-25' ) a LEFT JOIN datatable b ON a.date = b.tDate
查看結果:qt
另一種比較笨的方法是使用union all 單獨查詢出來7天的數據 配合 left join 條件 查詢出數據。
select a.click_date, ifnull(b.click_qty, 0) from ( select * from ( SELECT curdate() as click_date union all SELECT date_sub(curdate(), interval 1 day) as click_date union all SELECT date_sub(curdate(), interval 2 day) as click_date union all SELECT date_sub(curdate(), interval 3 day) as click_date union all SELECT date_sub(curdate(), interval 4 day) as click_date union all SELECT date_sub(curdate(), interval 5 day) as click_date union all SELECT date_sub(curdate(), interval 6 day) as click_date ) ) a left join ( select click_date, count(*) as click_qty from click_log_table group by click_date --我使用的是這種方式,估計之後還得改,條件要放到left join 裏面 否則沒效果 ) b
最後個人七天數據查詢是這樣寫的:
SELECT COALESCE (b.new_add_count, 0) new_add_count, COALESCE (b.exit_count, 0) exit_count, COALESCE (b.active_count, 0) active_count FROM ( select * from ( SELECT date_sub(curdate(), interval 1 day) as statis_date union all SELECT date_sub(curdate(), interval 2 day) as statis_date union all SELECT date_sub(curdate(), interval 3 day) as statis_date union all SELECT date_sub(curdate(), interval 4 day) as statis_date union all SELECT date_sub(curdate(), interval 5 day) as statis_date union all SELECT date_sub(curdate(), interval 6 day) as statis_date union all SELECT date_sub(curdate(), interval 7 day) as statis_date ) d ) a LEFT JOIN stat_comm_group_day b ON a.statis_date = b.statis_date AND b.id=本身傳入的參數(這兒的條件不能拿到外層。)