zoukankan      html  css  js  c++  java
  • PHP+MySQL实现对一段时间内每天数据统计优化操作实例

    http://www.jb51.net/article/136685.htm

    这篇文章主要介绍了PHP+MySQL实现对一段时间内每天数据统计优化操作,结合具体实例形式分析了php针对mysql查询统计相关优化操作技巧,需要的朋友可以参考下

    在互联网项目中,对项目的数据分析必不可少。通常会统计某一段时间内每天数据总计变化趋势调整营销策略。下面来看以下案例。

    案例

    在电商平台中通常会有订单表,记录所有订单信息。现在我们需要统计某个月份每天订单数及销售金额数据从而绘制出如下统计图,进行数据分析。

    订单表数据结构如下:

    order_idorder_sntotal_priceenterdate
    25396A4E610E250C2D378D7EC94179E14617F2306.002017-04-01 17:23:26
    25397EAD217C0533455EECDDE39659ABCDAE917.902017-04-01 22:15:18
    25398032E6941DAD44F29651B53C41F6B48A0163.032017-04-02 07:24:36

    此时查询某月各天下单数,总金额应当如何做呢?

    一般方法

    首先最容易想到的方法,先利用 php 函数 cal_days_in_month() 获取当月天数,然后构造一个当月所有天的数组,然后在循环中查询每天的总数,构造新数组。

    代码如下:

     
    $month = '04' ;
    $year = '2017' ;
    $max_day = cal_days_in_month(CAL_GREGORIAN, $month , $year );   //当月最后一天
    //构造每天的数组
    $days_arr = array ();
    for ( $i =1; $i <= $max_day ; $i ++){
       array_push ( $days_arr , $i );
    }
    $return = array ();
    //查询
    foreach ( $days_arr as $val ){
       $min = $year . '-' . $month . '-' . $val . ' 00:00:00' ;
       $max = $year . '-' . $month . '-' . $val . ' 23:59:59' ;
       $sql = "select count(*) as total_num,sum(`total_price`) as amount from `orders` where `enterdate` >= {$min} and `enterdate` <= {$max}" ;
       $return [] = mysqli_query( $sql );
    }
    return $return ;

    这个sql简单,但是每次需要进行30次查询请,严重拖慢响应时间。

     

    优化

    如何使用一个sql直接查询出各天的数量总计呢?

    此时需要利用 mysql 的 date_format 函数,在子查询中先查出当月所有订单,并将 enterdate 用 date_format 函数转换为 天 ,然后按天 group by 分组统计。 代码如下:

     
    $month = '04' ;
    $year = '2017' ;
    $max_day = cal_days_in_month(CAL_GREGORIAN, $month , $year );   //当月最后一天
    $min = $year . '-' . $month . '-01 00:00:00' ;
    $max = $year . '-' . $month . '-' . $max_day . ' 23:59:59' ;
    $sql = "select t.enterdate,count(*) as total_num,sum(t.total_price) as amount (select date_format(enterdate,'%e') as enterdate,total_price from orders where enterdate between {$min} and {$max}) t group by t.enterdate order by t.enterdate" ;
    $return = mysqli_query( $sql );

    如此,将30次查询减少到1次,响应时间会大大提高。

     

    注意:

    1.由于需查询当月所有数据,在数据量过大时,不宜采取本方法。

    2.为避免当天没有数据而造成的数据缺失,在查询后,理应根据需求对数据进行处理。

  • 相关阅读:
    android高级页面效果集锦
    2018年Android的保活方案效果统计
    程序员如何预估自己的项目开发时间?
    Google开发者大会:你不得不知的Tensorflow小技巧
    练就Java24章真经—你所不知道的工厂方法
    一个完整Java Web项目背后的密码
    怎么捕获和记录SQL Server中发生的死锁
    使用跟踪标志位分析死锁
    通过SQL Server Profiler来监视分析死锁
    SQL Server中的死锁
  • 原文地址:https://www.cnblogs.com/lxwphp/p/15454434.html
Copyright © 2011-2022 走看看