http://www.jb51.net/article/136685.htm
This article mainly introduces the optimization operation of PHP+MySQL for daily data statistics for a period of time, and analyzes the optimization operation skills of PHP for MySQL query statistics in combination with specific examples. Friends who need it can refer to the following
In Internet projects, data analysis of the project is essential. Usually, the trend of the total daily data changes in a certain period of time is calculated to adjust the marketing strategy. Let's look at the following cases.
case
There is usually an order form in the e-commerce platform to record all order information. Now we need to count the number of daily orders and sales amount data in a certain month to draw the following statistical graph for data analysis.
The order table data structure is as follows:
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 |
At this time, how to query the number of orders in each day of a month and the total amount?
general method
The easiest way to think of first is to use the php function cal_days_in_month()
to get the number of days in the current month, then construct an array of all days in the current month, and then query the total number of days in a loop to construct a new array.
code show as below:
$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
;
|
This sql is simple, but requires 30 queries each time, which seriously slows down the response time.
optimization
How to use a sql to directly query the total number of days?
At this time, you need to use the mysql date_format
function to find out all the orders in the current month in the subquery, and convert the enterdate into days with the date_format function, and then group by
group statistics by day. code show as below:
$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
);
|
In this way, reducing the 30 queries to 1, the response time will be greatly improved.
Notice:
1. Since all data of the current month needs to be queried, this method should not be adopted when the amount of data is too large.
2.为避免当天没有数据而造成的数据缺失,在查询后,理应根据需求对数据进行处理。