PHPとmysqlで、

MYSQLに入っているデータが


  date      ステータス
2011-6-21-13:47:33 あり 
2011-6-21-13:48:33 あり 
2011-7-21-13:47:33 不良
2011-7-21-13:47:34 あり
2011-7-21-13:48:33 あり

のように入っています
dateは、datetime型で、ステータスはvarchar型で、ステータスは『あり』か『不良』です。
これを、
この1つ前ページで

1.何年何月~何年何月までと選択させる
2.2011年等年数は固定で、 何月と選択させて1日~31日か1日~30日か
1日~28日までのデータ
3.2011年と月固定して、日付だけを選択させて1日分のデータ

の3パターンいずれかの方法で集計して表示したい

集計データの表示の仕方は

集計 例1

1.2011年6月~2011年8月選択の場合
      あり 不良
2011-6    2   0
2011-7    2   1

2.2011年が固定で、6月選択の場合
      あり 不良
2011-6-01  0   0
  :
2011-6-21  2   0
  :
2011-6-31  0   0

3.2011年と6月が固定で、21日選択の場合

      あり 不良
2011-6-21  2   0

のようにやりたいと思っています。
なにか方法か、参考になるものがあれば教えて欲しいです

回答の条件
  • 1人5回まで
  • 13歳以上
  • 登録:2011/09/30 16:25:10
  • 終了:2011/10/03 11:00:21

ベストアンサー

id:tdoi No.1

tdoi回答回数174ベストアンサー獲得回数752011/09/30 16:48:59

DATE_FORMATとGROUP BY句をうまく使ってください。


1.2011年6月~2011年8月選択の場合であれば、

SELECT
   DATE_FORMAT(date, '%Y-%m') AS month,
   ステータス,
   COUNT(*) AS count
FROM
   テーブル名
WHERE
   date BETWEEN '2011-06-01 00:00:00' AND '2011-08-31 23:59:59'
GROUP BY
   month,
   ステータス

というクエリで、

month |ステータス| count
-------------------------
2011-6|あり      | 2
2011-6|異常      | 0
2011-7|あり      | 2
2011-7|異常      | 1

のような結果が得られます。あとは、PHP側でお好きなように加工してください。

他のケースも同様な形で。

何かの参考になれば。




追記です。

データの内容を項目名として抽出することはできません。

PHP側ですぐに加工できる話ですし。

$data = array();
$result = mysql_query(上記クエリ);
while ($row = mysql_fetch_assoc($result)) {
    $month = $data[$row['month']];
    if (!isset($data[$month])) {
        $data['month'] = array('あり' => 0, '異常' => 0);
    }
    if ($row[ステータス] == 'あり') {
        $data['month']['あり'] += $row['count'];
    } else {
        $data['month']['異常'] += $row['count'];
    }
}

さらに追記。

サブクエリを使えばいける気もしてきました。

ありのカウントの結果と、異常のカウントの結果をユニオンしてあげれば・・・。

効率悪い気がするので、おススメしませんが。


失礼。括弧は不要です。

id:koonii26

知らなかったです。

こういう考え方があるんですね。

ありがとうございます。

$month = $data[$row['month'); ←カッコは消していいのでしょうか?

カッコ消しました

2011/09/30 18:57:55

コメントはまだありません

この質問への反応(ブックマークコメント)

「あの人に答えてほしい」「この質問はあの人が答えられそう」というときに、回答リクエストを送ってみてましょう。

これ以上回答リクエストを送信することはできません。制限について

絞り込み :
はてなココの「ともだち」を表示します。
回答リクエストを送信したユーザーはいません