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

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

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

 

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

 

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

 

案例

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

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

订单表数据结构如下:

order_id order_sn total_price enterdate
25396 A4E610E250C2D378D7EC94179E14617F 2306.00 2017-04-01 17:23:26
25397 EAD217C0533455EECDDE39659ABCDAE9 17.90 2017-04-01 22:15:18
25398 032E6941DAD44F29651B53C41F6B48A0 163.03 2017-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.为避免当天没有数据而造成的数据缺失,在查询后,理应根据需求对数据进行处理。

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

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/113365.html原文链接:https://javaforall.net

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • int使用规则_point是什么意思

    int使用规则_point是什么意思先说结论吧,方便快速查询验证。总结区别int类型大小为8字节int8类型大小为1字节int16类型大小为2字节int32类型大小为4字节int64类型大小为8字节go语言中的int的大小是和操作系统位数相关的,如果是32位操作系统,int类型的大小就是4字节;如果是64位操作系统,int类型的大小就是8个字节取值范围int8:-128~127int16:-32768~32767int32:-2147483648~214

    2022年8月15日
    1
  • pycharm2018激活码 pycharm激活码_软件一键无痕看怎么使用的

    pycharm2018激活码 pycharm激活码_软件一键无痕看怎么使用的PyCharm激活码最新破解教程,Mac版激活至2299年,PyCharm激活码2021.3.3

    2022年4月20日
    157
  • Onenote插件,云扩容

    Onenote插件,云扩容目录1.onenote2.插件3.云空间扩容4.onenote教程这些博主找了好久,现在一步到胃。特发布这篇文章,为后来的人指路。onenote各系列,公众号“软件管家”,有365,2016-2021系列,可正常同步。插件onetastic,直接官网免费onenoteclipper同onenotegem珍,有16版的,亲测可用于365版本。复制这段内容打开「百度网盘」APP即可获取链接:https://pan.baidu.com/s/1DtWmSRQ3cy1S6upA6DLU

    2022年9月9日
    0
  • Redis的雪崩,击穿,穿透详解「建议收藏」

    Redis的雪崩,击穿,穿透详解「建议收藏」在今天的互联网里,高并发、大数据量、大流量已经成为了代言词,那么我们的系统也承受着巨大的压力,首当其冲的解决方案就是redis。那么redis使用不当就会产生雪崩、穿透、击穿等问题,这也是考验一个程序员技术能力的时刻。当然面试的时候,这也是高频面试题,几乎大厂都会问到。下面跟着贴心老哥一起来看看这些技术吧。缓存雪崩举例双十一期间,所有用户一打开淘宝就是进入首页,首页的压力非常大,为了提高并发,将网站首页数据都缓存到redis里,所有的rediskey失效时间都是3小时。双十一当天大量

    2022年9月14日
    0
  • idea2021激活码【最新永久激活】

    (idea2021激活码)好多小伙伴总是说激活码老是失效,太麻烦,关注/收藏全栈君太难教程,2021永久激活的方法等着你。IntelliJ2021最新激活注册码,破解教程可免费永久激活,亲测有效,下面是详细链接哦~https://javaforall.net/100143.html1HV55HYOZP-eyJsaWNlbnNlSW…

    2022年3月28日
    1.2K
  • goland2022.01.4激活码_最新在线免费激活

    (goland2022.01.4激活码)好多小伙伴总是说激活码老是失效,太麻烦,关注/收藏全栈君太难教程,2021永久激活的方法等着你。IntelliJ2021最新激活注册码,破解教程可免费永久激活,亲测有效,下面是详细链接哦~https://javaforall.net/100143.html747EFQ8BIF-eyJsaWNlbnNlSW…

    2022年3月31日
    56

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号