質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

ただいまの
回答率

90.61%

  • PHP

    19882questions

    PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

  • HTML

    8694questions

    HTMLとは、ウェブ上の文書を記述・作成するためのマークアップ言語のことです。文章の中に記述することで、文書の論理構造などを設定することができます。ハイパーリンクを設定できるハイパーテキストであり、画像・リスト・表などのデータファイルをリンクする情報に結びつけて情報を整理します。現在あるネットワーク上のほとんどのウェブページはHTMLで作成されています。

  • MySQL

    5702questions

    MySQL(マイエスキューエル)は、TCX DataKonsultAB社などが開発するRDBMS(リレーショナルデータベースの管理システム)です。世界で最も人気の高いシステムで、オープンソースで開発されています。MySQLデータベースサーバは、高速性と信頼性があり、Linux、UNIX、Windowsなどの複数のプラットフォームで動作することができます。

PHPの実行速度・表示速度をあげたい※画像追加しました

解決済

回答 2

投稿 ・編集

  • 評価
  • クリップ 0
  • VIEW 910

ao_love

score 420

受付者ごとの一日の受付本数をtable表示するプログラムを作成しているのですが、表示に時間がかかってしまいます。
何とか素早く表示させたいのですが、どのように書き換えれば早く表示ができるようになるか、お知恵を貸していただけないでしょうか?

条件としては
・表示開始日と終了日は選択できる必要がある
・稼働している受付者全員分を表示する
・受付者ID・名前も別DBから取得
・表示は縦に日付、横に受付者名
です。

完成させたいのは以下のような表になります。
イメージ説明
今のプログラムは以下の通りです。

//開始~終了までの日数を計算・期間内の日付を配列に格納
$span = (strtotime($end_day)-strtotime($start_day))/(60*60*24);
for($i=0 ; $i<= $span ; $i++){
    $getdate = strtotime("$i day",strtotime($start_day));
    $dates[$i] = date("Y-m-d",$getdate);
}

$sql_d = "SELECT receiver_id,
                 receiver_name
            FROM receiver
           WHERE receiver_register = 0
             AND receiver_id > 0
        ORDER BY receiver_id";
$res_d = $conDB->query($sql_d);

foreach($res_d AS $key=>$val){
    $receiver[$val['receiver_id']] = $val['receiver_name'];
}

foreach($receiver AS $key=>$value){//①
        $name = $value;
        $cnt = "";
        $cnt_td = "";
        $td = "";
        $sum = "";
    foreach($dates AS $d_key=>$date){//②
        $td .= "<tr><td>".$date."</td></tr>";
        $sql = "SELECT count(*) as cnt,
                       DATE_FORMAT(sales_date,'%Y-%m-%d') AS sdate,
                       sales_reception AS rcpt,
                       sales_date
                  FROM sales
                 WHERE sales_reception = '$key'
              GROUP BY sales_reception,sdate
                HAVING sdate = '$date'";
        $res = $conDB->query($sql);
        
        if(!$res){
            $cnt[] = 0;
        }else{
            $cnt[] = $res[0]['cnt'];
        }
    }
    foreach($cnt AS $count){
        $sum += $count; 
        $cnt_td .= "<tr><td>".$count."</td></tr>";
    }
    
    $html .= "<td><table ><tr><td>".$name."</td></tr>".$cnt_td."<tr><td>".$sum."</td></tr></table></td>";
}
$date_html = "<td><table width='120px'><tr><td>日付</td></tr>".$td."<tr><td>合計</td></table></td>";

処理速度を測ったところ、
②の処理が1回で0.1秒程度×日数分なので一月なら3秒程度
①全体ではそれ掛ける15人分で45秒ほどかかってしまいます。

条件さえ満たせば中身はどのような形でも構いません。
よろしくお願いいたします。
  • 気になる質問をクリップする

    クリップした質問は、後からいつでもマイページで確認できます。

    またクリップした質問に回答があった際、通知やメールを受け取ることができます。

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

回答 2

checkベストアンサー

0

1人1日分ずつ取得する手間をかけずに、まとめてSQLに投げてしまってはどうでしょうか。

特定のIDリストから取得したいのであれば、PHP側でimplodeした上で、SQLのIN(...)を使えばまとめて条件化できます。日付については、SQLのBETWEEN x AND yを使って範囲指定でいいでしょう。あと、変換していないsales_dateに直接条件をかける形にするなら、HAVINGでなくWHERE条件にできます。

せっかくGROUP BYを使っているのに、1データずつ取得するのではもったいないです。

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2015/01/14 16:21

    ありがとうございます。
    まずは受付者のIDをimplodeでつなげてINで取得してみたのですが、
    そうすると受付を行ってない日にはデータが存在しないため、その部分のtdが作成できませんでした…

    先ほど条件に書き忘れてしまったのですが、受付のない日も表に"0"と表示させなければなりません。
    SQLでに全部を投げてbetweenもこのプログラムになる前にやってみたのですが、結局空のtdが作れず断念しました…

    キャンセル

  • 2015/01/14 17:05

    ユーザーリスト×必要な日数の0で埋めた2次元配列をPHP側で作っておいて、データベースからのデータを埋めていけば、0詰めの表が出来上がると思います。

    キャンセル

  • 2015/01/14 19:51

    ありがとうございます。
    あらかじめ0入りの配列を作っておくことは思いつきませんでした。
    今回は全く違う部分が原因だったようで自己解決しましたが、0入り配列の考え方は使える場面がたくさんありそうなので覚えておきます!
    ありがとうございました(^^)

    キャンセル

0

非常に初歩的な部分から自己解決しました…
そもそも1回のSQLに時間がかかりすぎでは?と思い立ち該当テーブルのINDEXを確認したところ、
受付者のカラムにINDEXがありませんでした--;
INDEXを作成したところ、ページの表示が0.1秒ほどに…

maisumakun様、貴重なお時間を割いていただきありがとうございました。

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

15分調べてもわからないことは、teratailで質問しよう!

  • ただいまの回答率 90.61%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

関連した質問

  • 解決済

    最新のTwitterAPIに対応できるコードを知りたい!!

    はじめまして! 現在、githubで公開されているOAuthライブラリ「twitteroauth」を使用して、Twitterのつぶやき情報を集めようとしている者です。 http

  • 受付中

    PHPの問題

    2010/09/01 2010/10/12 2010/8/2 2010/10/2 2010/5/12 を 2010/09/01 2010/10/12 2010/08/02 20

  • 解決済

    SQL テーブルの結合について

    以下のプログラムは年月と売上個数を出すものです。 このプログラムにさらに、翌月のデータ(年月200103、売上個数0)が表示されるようにしたいのですが、うまくできません。 yea

  • 解決済

    mysql 完全一致及び部分一致検索について

    ある特定カラム(例:name)に対して、完全一致で検索し、該当レコードがない場合、部分一致検索を一回のSQLクエリで実行したいのですが、可能でしょうか。 ご教授いただけると幸いです

  • 受付中

    ユニークアイテムの推移を集計

    下記のようなテーブルがあるときに、直近1日間,7日間,30日間に購入されたproductの ユニーク数を日毎に集計したいと思っています。 テーブルイメージ create

  • 受付中

    PHP配列の重複を調べるには

    2つの配列を比較して重複しているものを調べたいのですが上手くいきません。 配列のキーに"id"・"map"・"date"があり、"id"・"map"のキーの値を比較して重複し

  • 解決済

    WP Most Popular PVを期間を決めて集計

    「WP Most Popular」というPVを集計する プラグインを使って1ヶ月のランキングを 作りたいと思っております。 ただし条件として、毎月1日スタートで 月末締めで

  • 解決済

    SQLで一か月分の日別のデータを作成する。

    日付ごとに集計をだしたく色々しらべており理想の参考サイトを見つけました。 参考サイト さらに日付毎に何回足し算をしたかといったカウントもとりたいのですがそちら下記の文に何を

同じタグがついた質問を見る

  • PHP

    19882questions

    PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

  • HTML

    8694questions

    HTMLとは、ウェブ上の文書を記述・作成するためのマークアップ言語のことです。文章の中に記述することで、文書の論理構造などを設定することができます。ハイパーリンクを設定できるハイパーテキストであり、画像・リスト・表などのデータファイルをリンクする情報に結びつけて情報を整理します。現在あるネットワーク上のほとんどのウェブページはHTMLで作成されています。

  • MySQL

    5702questions

    MySQL(マイエスキューエル)は、TCX DataKonsultAB社などが開発するRDBMS(リレーショナルデータベースの管理システム)です。世界で最も人気の高いシステムで、オープンソースで開発されています。MySQLデータベースサーバは、高速性と信頼性があり、Linux、UNIX、Windowsなどの複数のプラットフォームで動作することができます。