PHP と MySQL は毎日のデータの最適化された統計を実装します

小云云
リリース: 2018-03-20 09:40:35
オリジナル
4906 人が閲覧しました

インターネットプロジェクトでは、プロジェクトのデータ分析が不可欠です。通常、マーケティング戦略を調整するために、一定期間内の毎日の合計データの変化の傾向が計算されます。以下のケースを見てみましょう。

ケース

通常、電子商取引プラットフォームには、すべての注文情報を記録する注文フォームがあります。データ分析のために、ある月の 1 日あたりの注文数と売上高をカウントし、次のような統計グラフを作成する必要があります。

注文テーブルのデータ構造は以下の通りです:

25396A4E610E250C2D378D7EC94179E14617F2306.002017-04-01 17:23:262539 7EAD217C0533455EECDDE3​​9659ABCDAE917.902017-04-01 22:15:18
order_id order_sn total_price enterdate
25398 032E6941DAD44F29651B53C41F6B48A0 163.03 2017-04-02 07:24:36

毎日の注文数をクエリする月の合計金額はどのように計算すればよいですか?

一般的な方法

最初に思いつく最も簡単な方法は、php 関数 <a href="http://www.php.cn/wiki/1230.html" target=" を使用することです。 _blank">cal_days_in_month<code><a href="http://www.php.cn/wiki/1230.html" target="_blank">cal_days_in_month</a>() 获取当月天数,然后构造一个当月所有天的数组,然后在循环中查询每天的总数,构造新数组。

代码如下:


$month = &#39;04&#39;;
$year = &#39;2017&#39;;
$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.&#39;-&#39;.$month.&#39;-&#39;.$val.&#39; 00:00:00&#39;;
  $max = $year.&#39;-&#39;.$month.&#39;-&#39;.$val.&#39; 23:59:59&#39;;
  $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 的 <a href="http://www.php.cn/wiki/1410.html" target="_blank">date_format</a> 函数,在子查询中先查出当月所有订单,并将 enterdate 用 date_format 函数转换为 天 ,然后按天 group by() 月の日数を取得し、その月のすべての日の配列を構築し、ループ内で各日の合計数をクエリし、新しい配列を構築します。

コードは次のとおりです:

$month = &#39;04&#39;;
$year = &#39;2017&#39;;
$max_day = cal_days_in_month(CAL_GREGORIAN, $month, $year);   //当月最后一天
$min = $year.&#39;-&#39;.$month.&#39;-01 00:00:00&#39;;
$max = $year.&#39;-&#39;.$month.&#39;-&#39;.$max_day.&#39; 23:59:59&#39;;
$sql = "select t.enterdate,count(*) as total_num,sum(t.total_price) as amount (select date_format(enterdate,&#39;%e&#39;) 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);
ログイン後にコピー

この SQL は単純ですが、毎回 30 個のクエリが必要になるため、応答時間が大幅に遅くなります。

最適化

SQL を使用して毎日の合計数量を直接クエリするにはどうすればよいですか?

現時点では、mysql の <a href="http://www.php.cn/wiki/1410.html" target="_blank">date_format</a> 関数を使用する必要があります。 subquery まず当月のすべての注文を検索し、date_format 関数を使用して enterdate を日数に変換してから、統計を日ごとに group by でグループ化します。 コードは次のとおりです:

rrreee このようにして、30 個のクエリを 1 個に減らすと、応答時間が大幅に改善されます。

注:

1. 当月のすべてのデータをクエリする必要があるため、データ量が多すぎる場合はこの方法を採用しないでください。

2. その日のデータがないことによるデータの損失を避けるために、クエリ後、必要に応じてデータを処理する必要があります。

関連する推奨事項:

🎜PHP Echarts を使用して統計レポートを生成する詳細な説明 🎜🎜🎜🎜php バージョンの WeChat データ統計インターフェイスの使用例 🎜🎜🎜🎜php データ統計チャートのサンプルコードの詳細な説明_PHP チュートリアル 🎜🎜🎜🎜🎜 🎜🎜🎜🎜

以上がPHP と MySQL は毎日のデータの最適化された統計を実装しますの詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

関連ラベル:
ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
最新の問題
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート