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

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

新規登録して質問してみよう
ただいま回答率
85.48%
MySQL

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

PHP

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

Q&A

解決済

3回答

5384閲覧

日にちごとのデータを集計したい

puuko

総合スコア12

MySQL

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

PHP

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

0グッド

0クリップ

投稿2016/10/20 16:20

編集2016/10/20 16:24

サイトの登録数、レビュー投稿数、ポイント交換申請数の日にちごとの集計を取りたいのですが、うまくいかないのでご教授お願いします。

プルダウンメニューで、見たい月を選び、その月の稼働情報を表示させたいです。
投稿レビュー数はreview、登録情報はlogin、ポイント申請数はgt_grantというデータベースからそれぞれ呼び出したいと思っています。
日付はそれぞれdatetimeで登録してあります。

まずはレビュー数を呼び出そうとしているのですが、10月のレビュー数全部の数は呼び出せても、それをカレンダーの日にちと結びつけて日にちごとに集計する部分で、どう結びつければいいのかわかりません。

=================カレンダー==================

php

1 2$yea=$_REQUEST["year"];//年 3$mon=$_REQUEST["month"];//月 4 5$year=sprintf("%04d-",$yea); 6$month=sprintf("%02d",$mon); 7$date_y_m=$year.$month;//曖昧検索 8 9$data[]=""; 10$message[]=""; 11 12if ($year!="" || $month!=""){ 13 14$today_year = (int)$year;//文字列を数字に変換 15$today_month = (int)$month; 16 17if(checkdate($today_month, 1, $today_year)){//日付が正しいかチェック 18 19//カレンダー開始日(指定された年月の最初の日のYYYY-MM-DD形式) 20$startYmd = sprintf('%04d-%02d-%02d', $today_year, $today_month, 1); 21 22//カレンダー開始タイムスタンプ 23$start = strtotime($startYmd); 24 25//これに24時間ずつ加算し、1ヶ月分(月が同じ範囲)の日付の一覧を作成 26for ($t = $start; date('m', $t) == date('m', $start); $t += 60 * 60 * 24) { 27 28$data[] = $t;//1~31 チェックデートでfalseが出たら処理を打ち止め 29 30} 31 32}else{ 33$message="存在しない日付です。やり直してください"; 34}//if(checkdate($mon, 1, $y)) 35 36}else{ 37 38$message="年月日を選択して、表示ボタンを押してください"; 39 40}//if ($y!="" || $mon!="")

=============レビューが書かれた日にち呼び出し==========

php

1 2$count_rev_date = []; 3$record_rev_sql="SELECT * FROM review WHERE rev_date LIKE '$date_y_m%'"; 4$record_rev_stt=$dbh->prepare($record_rev_sql); 5$record_rev_stt->execute(); 6 7while($record_rev_result=$record_rev_stt->fetch()){ 8 9$count_rev_date[] = $record_rev_result["rev_date"]; 10} 11//rev_dateに日付が入っています。

================集計カレンダー表示===================

php

1<div class="admin_right"> 2<?php 3if(isset($date)){ 4?> 5<div class="running_info"> 6 7<p><?php print($today_year); ?><?php print($today_month); ?>の稼働情報</p> 8<ul class="running_ul_index"> 9<li>日付</li> 10<li>仮登録</li> 11<li>登録</li> 12<li>投稿レビュー数</li> 13<li>カード申請数</li> 14</ul> 15<?php 16 17foreach($data as $d_value){ 18 19$review_date=date("Y年m月d日" , $d_value); 20 21 22?> 23 24<ul class="running_ul"> 25<li> 26<?php print ($review_date); ?> 27</li> 28<li> 29 30</li> 31<li> 32 33</li> 34<li> 35 36</li> 37<li> 38<!--ここにレビュー数--> 39</li> 40</ul> 41 42<?php 43}//foreach($data as $d_value) 44?> 45 46</div><!-- running_info --> 47 48<?php 49}//if(isset($date)) 50?> 51 52</div><!-- admin_right -->

まだまだ途中の段階で中途半端な記述でわかりづらく申し訳ありません。
カレンダーの日にちと、その月のレビューを書いた日付をどう結びつければいいのかわからなくなってしまいました...。
よろしくお願いいたします。

気になる質問をクリップする

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

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

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答3

0

カレンダーと結びつける一つの案としてです。テーブル内容は想像して作成しています。

php

1 //日毎にレビュー数を集計 2 $count_rev_date = []; 3 $record_rev_sql="SELECT date_format(rev_date,'%Y-%m-%d') as rev_date, count(*) as cnt FROM review WHERE rev_date LIKE '$date_y_m%' group by 1"; 4 $record_rev_stt=$dbh->prepare($record_rev_sql); 5 $record_rev_stt->execute(); 6 7 while($record_rev_result=$record_rev_stt->fetch()){ 8 //ハッシュ配列に保存 9 $count_rev_date[$record_rev_result["rev_date"]] = $record_rev_result["cnt"] 10 } 11 //rev_dateに日付が入っています。

カレンダーの作成する際に日付を使って一緒に処理する

php

1 // $i 1~31のイメージ 2 if (array_key_exists($data[$i], $count_rev_date)) 3 { 4    //レビューが有った日 5    $cnt=$count_rev_date[$data[$i]]; 6 }else{ 7    //レビューが無かった日 8 }

投稿2016/10/20 22:58

編集2016/10/21 00:51
A.Ichi

総合スコア4070

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

KiyoshiMotoki

2016/10/21 00:21

セレクト句の rev_date と count(*) の間のカンマが抜けていますよ。 また、 > 日付はそれぞれdatetimeで登録してあります とのことですので、 group by rev_date だと時分秒まで考慮した集計を行なってしまう可能性がありますよ。
A.Ichi

2016/10/21 00:27

ご指摘の通り間違っております。修正いたしました。有難うございます。
A.Ichi

2016/10/21 00:33

追伸、ハッシュキーと同じ値にする様に、to_char(rev_date,’YYYYMMDD’)で編集してください。
KiyoshiMotoki

2016/10/21 00:36

度々の指摘で恐縮ですが、、 rev_date::date は、MySQL ではサポートされていない構文です。 MySQL の場合は DATE(rev_date) とするのが一般的かと。
A.Ichi

2016/10/21 00:38

$startYmd = sprintf('%04d-%02d-%02d'... されているので::dateで大丈夫みたいですね。
A.Ichi

2016/10/21 00:46

重ね重ね有難うございます。to_charでも無いのでdate_formatにて修正いたしました。
puuko

2016/10/21 15:50

大変遅くなってしまい申し訳ありませんでした。 どうもありがとうございました! カレンダーの作成する際に日付を使って一緒に処理する部分の記述の場所が間違っていたのか、うまく表示することができませんでしたが、集計ではすべて呼び出すことができ 表示する際には $rev_result = $count_rev_date[date('Y-m-d', $d_value)]; で思い通り出すことができました。 select部分の記述がわかりやすく、とても参考になりました! どうもありがとうございました!
guest

0

ベストアンサー

以下のコードは投稿レビュー数の集計のみですが、登録情報およびポイント申請数も同様の操作で取得できます。

=============レビューが書かれた日にち呼び出し==========

php

1$date_y_m = '2016-10'; // 実際はプルダウンで選択した年月 2 3$record_rev_sql = " 4 SELECT DATE_FORMAT(rev_date, '%d') rev_day, COUNT(*) count 5 FROM review 6 WHERE rev_date >= :target 7 AND rev_date < DATE_ADD(:target, INTERVAL 1 MONTH) 8 GROUP BY rev_day 9 ORDER BY rev_day ASC 10"; 11$record_rev_stt = $dbh->prepare($record_rev_sql); 12$record_rev_stt->bindValue(':target', $date_y_m . '-01', PDO::PARAM_STR); 13$record_rev_stt->execute(); 14 15$count_rev_date = []; 16while(($record_rev_result = $record_rev_stt->fetch(PDO::FETCH_ASSOC)) !== false){ 17 $count_rev_date[(int) $record_rev_result['rev_day']] = (int) $record_rev_result['count']; 18} 19 20// var_dump($count_rev_date);

変数 $count_rev_date がどのような構造の配列になっているかは、var_dump するなどしてご自分で確認してください。

ただし、この方法では投稿レビューが1つもない日の投稿数は取得できません。
どういうことかと言うと、例えば 10月19日、20日、21日の投稿レビュー数がそれぞれ 10、0、20 だったとすると、
変数 $count_rev_date の要素は

19 => 10 20 => 0 21 => 20

とはならず、

19 => 10 21 => 20

となってしまいます。

この点については、「集計カレンダー表示」の方を工夫して対応するのがよいでしょう。

投稿2016/10/21 00:12

編集2016/10/21 00:55
KiyoshiMotoki

総合スコア4791

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

puuko

2016/10/21 15:42

大変遅くなってしまい申し訳ありませんでした。 丁寧に教えて頂いてありがとうございました! foreach($data as $d => $d_value){ $review_date=date("Y年m月d日" , $d_value); $interim_result = $count_interim_date[date('j', $d_value)]; $regist_result = $count_regist_date[date('j', $d_value)]; $grant_result = $count_grant_date[date('j', $d_value)]; $result = $count_rev_date[date('j', $d_value)]; ?> <ul class="running_ul"> <li> <?php print ($review_date); ?> </li> <li> <?php print ((int)$interim_result); ?> </li> <li> <?php print ((int)$regist_result); ?> </li> <li> <?php print ((int)$result); ?> </li> <li> <?php print ((int)$grant_result); ?> </li> </ul> <?php }//foreach($data as $d_value) ?> この表示の部分でうまく表示されず、悩みましたが、どのような構造になっているか確認してみてくださいとあったので、よく確認してみたらdateの”j”の部分を”d”にしていたことに 気付きました。 全て表示することができました。 どうもありがとうございます!
guest

0

下記のSQLを作成すると日付毎の集計ができます。
・BETWEENで月の始めと終わりを指定する。
・日付けをDATEFORMAT関数でyyyyMMdd形式に変換する。
・日付毎でGROUP BYする。
・SUM関数でレビュー数を集計する。

上記の結果をPHPでカレンダーに表示すればできますね。

投稿2016/10/20 16:35

yona

総合スコア18155

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

puuko

2016/10/21 15:53

大変遅くなってしまい申し訳ありませんでした。 教えていただいてありがとうございました! いろいろ試しながら勉強していきたいと思います! ありがとうございます。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問