@H_301_0@本文实例讲述了PHP+MysqL实现对一段时间内每天数据统计优化操作。分享给大家供大家参考,具体如下:
@H_301_0@在互联网项目中,对项目的数据分析必不可少。通常会统计某一段时间内每天数据总计变化趋势调整营销策略。下面来看以下案例。
@H_3010@<span style="font-size: medium">
案例
@H301_0@在电商平台中通常会有订单表,记录所有订单信息。现在我们需要统计某个月份每天订单数及销售金额数据从而绘制出如下统计图,进行数据分析。
@H_301_0@

@H_3010@订单表数据结构如下:
@H301_0@
<table style="Box-sizing: border-Box; text-align: center; widows: 2; text-transform: none; background-color: rgb(255,255,255); font-style: normal; text-indent: 0px; width: 700px; display: table; border-collapse: collapse; font-family: -apple-system,"SF UI Text",Arial,"PingFang SC","Hiragino Sans GB","Microsoft YaHei","WenQuanYi Micro Hei",sans-serif,SimHei,SimSun; white-space: normal; orphans: 2; margin-bottom: 24px; letter-spacing: normal; color: rgb(69,69,69); font-size: 16px; font-weight: normal; word-spacing: 0px; font-variant-ligatures: normal; font-variant-caps: normal; -webkit-text-stroke-width: 0px">
<thead style="Box-sizing: border-Box">
<tr style="Box-sizing: border-Box; border-right-width: 0px; background-color: rgb(255,255); border-bottom-width: 0px; border-top: rgb(221,221,221) 1px solid; border-left-width: 0px; border-image: initial">
<th style="Box-sizing: border-Box; border-bottom: rgb(221,221) 1px solid; text-align: left; border-left: rgb(221,221) 1px solid; padding-bottom: 8px; line-height: 22px; background-color: rgb(239,243,245); padding-left: 8px; padding-right: 8px; word-wrap: break-word; color: rgb(79,79,79); font-size: 14px; vertical-align: middle; word-break: normal; border-top: rgb(221,221) 1px solid; font-weight: 700; border-right: rgb(221,221) 1px solid; padding-top: 8px">order_id
<th style="Box-sizing: border-Box; border-bottom: rgb(221,221) 1px solid; padding-top: 8px">order_sn
<th style="Box-sizing: border-Box; border-bottom: rgb(221,221) 1px solid; padding-top: 8px">total_price
<th style="Box-sizing: border-Box; border-bottom: rgb(221,221) 1px solid; padding-top: 8px">enterdate
</tr> Box-sizing: border-Box; border-bottom: 0px; border-left: 0px; border-top: 0px; border-right: 0px">
cal_days_in_month()
获取当月天数,然后构造一个当月所有天的数组,然后在循环中查询每天的总数,构造新数组。
@H_301_0@代码如下:
PHP;">
$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;
@H_301_0@这个sql简单,但是每次需要进行30次查询请,严重拖慢响应时间。
@H_301_0@优化
@H_301_0@如何使用一个sql直接查询出各天的数量总计呢?
@H_301_0@此时需要利用 MysqL 的 date_format
函数,在子查询中先查出当月所有订单,并将 enterdate 用 date_format 函数转换为 天 ,然后按天 group by
分组统计。 代码如下:
PHP;">
$month = '04';
$year = '2017';
$max_day = cal_days_in_month(CAL_GREGORIAN,$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);
@H_301_0@如此,将30次查询减少到1次,响应时间会大大提高。
@H_301_0@