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.为避免当天没有数据而造成的数据缺失,在查询后,理应根据需求对数据进行处理。

  • 相关阅读:
    POJ 1300 Open Door
    POJ 2230 Watchcow
    codevs 1028 花店橱窗布置
    codevs 1021 玛丽卡
    codevs 1519 过路费
    codevs 3287 货车运输
    codevs 3305 水果姐逛水果街二
    codevs 1036 商务旅行
    codevs 4605 LCA
    POJ 1330 Nearest Common Ancestors
  • 原文地址:https://www.cnblogs.com/lxwphp/p/15454434.html
Copyright © 2011-2022 走看看