PHP+MySQL实现对一段时间内每天数据统计优化操作实例

本文实例讲述了PHP+MysqL实现对一段时间内每天数据统计优化操作。分享给大家供大家参考,具体如下:

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

案例

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

订单表数据结构如下:

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"> Box-sizing: border-Box"> 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"> Box-sizing: border-Box; border-bottom: 0px; border-left: 0px; border-top: 0px; border-right: 0px"> Box-sizing: border-Box; border-right-width: 0px; background-color: rgb(255,221) 1px solid; border-left-width: 0px; border-image: initial">
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 Box-sizing: border-Box; border-bottom: rgb(221,221) 1px solid; padding-top: 8px">order_sn Box-sizing: border-Box; border-bottom: rgb(221,221) 1px solid; padding-top: 8px">total_price Box-sizing: border-Box; border-bottom: rgb(221,221) 1px solid; padding-top: 8px">enterdate
Box-sizing: border-Box; border-bottom: rgb(221,221) 1px solid; padding-bottom: 8px; line-height: 22px; padding-left: 8px; padding-right: 8px; word-wrap: break-word; color: rgb(79,221) 1px solid; border-right: rgb(221,221) 1px solid; padding-top: 8px">25396Box-sizing: border-Box; border-bottom: rgb(221,221) 1px solid; padding-top: 8px">A4E610E250C2D378D7EC94179E14617FBox-sizing: border-Box; border-bottom: rgb(221,221) 1px solid; padding-top: 8px">2306.00Box-sizing: border-Box; border-bottom: rgb(221,221) 1px solid; padding-top: 8px">2017-04-01 17:23:26Box-sizing: border-Box; border-right-width: 0px; background-color: rgb(247,247,247); border-bottom-width: 0px; border-top: rgb(221,221) 1px solid; padding-top: 8px">25397Box-sizing: border-Box; border-bottom: rgb(221,221) 1px solid; padding-top: 8px">EAD217C0533455EECDDE39659ABCDAE9Box-sizing: border-Box; border-bottom: rgb(221,221) 1px solid; padding-top: 8px">17.90Box-sizing: border-Box; border-bottom: rgb(221,221) 1px solid; padding-top: 8px">2017-04-01 22:15:18Box-sizing: border-Box; border-right-width: 0px; background-color: rgb(255,221) 1px solid; padding-top: 8px">25398Box-sizing: border-Box; border-bottom: rgb(221,221) 1px solid; padding-top: 8px">032E6941DAD44F29651B53C41F6B48A0Box-sizing: border-Box; border-bottom: rgb(221,221) 1px solid; padding-top: 8px">163.03Box-sizing: border-Box; border-bottom: rgb(221,221) 1px solid; padding-top: 8px">2017-04-02 07:24:36

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

一般方法

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

代码如下:

rush: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;

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

优化

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

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

rush: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);

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

注意:

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

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

更多关于PHP相关内容感兴趣的读者可查看本站专题:《》、《》、《》、《》、《》及《

希望本文所述对大家PHP程序设计有所帮助。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


服务器优化必备:深入了解PHP8底层开发原理
Golang的网络编程:如何快速构建高性能的网络应用?
Golang和其他编程语言的对比:为什么它的开发效率更高?
PHP8底层开发原理揭秘:如何利用新特性创建出色的Web应用
将字符重新排列以形成回文(如果可能)在C++中
掌握PHP8底层开发原理和新特性:创建高效可扩展的应用程序
服务器性能优化必学:掌握PHP8底层开发原理
PHP8新特性和底层开发原理详解:优化应用性能的终极指南
将 C/C++ 代码转换为汇编语言
深入研究PHP8底层开发原理:创建高效可扩展的应用程序
C++程序查找法向量和迹
PHP8底层开发原理实战指南:提升服务器效能
重排数组,使得当 i 为偶数时,arr[i] >= arr[j],当 i 为奇数时,arr[i] <= arr[j],其中 j < i,使用 C++ 语言实现
Golang的垃圾回收:为什么它可以减少开发人员的负担?
C++程序:将一个数组的所有元素复制到另一个数组中
Golang:构建智能系统的基石
为什么AI开发者应该关注Golang?
在C和C++中,逗号(comma)的用法是用来分隔表达式或语句
PHP8底层开发原理解析及新特性应用实例
利用PHP8底层开发原理解析新特性:如何构建出色的Web应用