文档章节

MYSQL-查询过去7天的数据 当天没有值的赋予默认值0或者其他

土茯苓
 土茯苓
发布于 2016/11/14 21:27
字数 696
阅读 337
收藏 1

最近公司在做统计,前端使用了ECHART,需要有7天的数据结果,后台调度数据的话使每天晚上0点一刻跑昨天一天的数据汇总。但是如果使新的数据,就不会有7天的数据可查。所以怎么构建空的统计数据给前端呢。

由于本人sql能力水平真的很差(这段时间要多加强),在百度和google了一大会之后,发现了两个不错的给了我思路的blog:

1.http://www.cnblogs.com/jethypc/p/5065857.html

2.https://segmentfault.com/q/1010000006663965

在 查询过去N天数据的时候,可以使用adddate()函数 和 CROSS JOIN 查询。

1.创建基础表:

CREATE TABLE num (i INT);
INSERT INTO num (i) VALUES (0),(1),(2),(3),(4),(5),(6),(7),(8),(9);

 2.查询时间范围

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 创建数据表

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 查询 (无值时补零)

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

查看结果:

另外一种比较笨的方法是使用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=自己传入的参数(这儿的条件不能拿到外层。)

 

© 著作权归作者所有

共有 人打赏支持
土茯苓
粉丝 32
博文 175
码字总数 197858
作品 0
朝阳
高级程序员
私信 提问
Mysql SQL查询今天、昨天、n天内、第n天

Mysql SQL查询今天、昨天、n天内、第n天 注意:因为对索引列使用函数会导致索引失效,如果查询时需要使用到索引,请使用MySQL DATESUB() 函数 查询当天的所有数据 查询昨天的所有数据 查询未...

三也视界
01/21
0
0
mysql的基本数据类型

前言 好比C++中,定义int类型需要多少字节,定义double类型需要多少字节一样,MySQL对表每个列中的数据也会实行严格控制,这是数据驱动应用程序成功的关键。MySQL提供了一组可以赋给表中各个...

凡尘里的一根葱
2015/10/11
8
0
MySQL 数据类型

1.数值类型 MYSQL支持所有标准SQL,这其中包括: 精确数值数据类型:INTERGER/INT,SMALLINT,DECIMAL/DEC,NUMERIC 近似数值数据类型:FLOAT,REAL,DOCULE PRECISION BIT数据类型 作为对标准SQL的扩...

VictorLi
2010/12/03
3.8K
9
MySQL学习笔记一

MySQL目录结构 配置my.ini MySQL5.7的my.ini位于ProgramDataMySQLMySQL Server 5.7目录下(可能有的版本的my.ini就在安装目录下),该该目录下还有一个data目录存放我们的创建的数据库。 打开...

Aaron_DMC
2016/12/16
27
0
MySQL数据类型和常用字段属性总结

前言 好比C++中,定义int类型需要多少字节,定义double类型需要多少字节一样,MySQL对表每个列中的数据也会实行严格控制,这是数据驱动应用程序成功的关键。M前言 好比C++中,定义int类型需要...

微凉清风
2017/07/27
0
0

没有更多内容

加载失败,请刷新页面

加载更多

zeppelin源码分析(6)——note的执行过程

上图是zeppelin的前后台交互模型,zeppelin采用单独的jvm来启动interpreter进程,该Interpreter进程与zeppelinServer进程之间采用Thrift协议通信,其中RemoteInterpreterProcess是Thrift-Cl...

群星纪元
19分钟前
0
0
promise

Promise是异步里面的一种解决方案,解决了回调嵌套的问题。 语法: new Promise( function(resolve, reject) {...} /* executor */ ); executor是带有 resolve 和 reject 两个参数的函数 。...

东东笔记
21分钟前
0
0
精华集锦 | 阿里如何提升团队的研发效能?

项目管理、交付、托管、测试、运维帮您告别996,追赶“211”,海量资源0元起,尽在开发者分会场, 云效鼓励师:以下是我们整理的云效公众号上【研发效能】相关的爆款文章,这些内容中有许多都...

zhaowei121
26分钟前
0
0
收集一些有用的

1 服务器镜像下载站点: https://msdn.itellyou.cn/ 2 Windows2012 r2 产品id: NB4WH-BBBYV-3MPPC-9RCMV-46XCB 3 软件下载: https://www.filepuma.com/https://www.manageengine.cn/ 4 ......

拜了个拜
32分钟前
0
0
HIVE 常见的内置函数

文章目录 1 关系运算 1.1 1、等值比较: = 1.2 2、不等值比较: 1.3 3、小于比较: < 1.4 4、小于等于比较: <= 1.5 5、大于比较: > 1.6 6、大于等于比较: >= 1.7 7、空值判断: IS NULL 1.8 8、非...

瑞查德-Jack
41分钟前
1
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部