人力検索はてな
モバイル版を表示しています。PC版はこちら
i-mobile

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/1件

▽最新の回答へ

1 ● tdoi
ベストアンサー

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'];
 }
}

さらに追記。

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

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

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


失礼。括弧は不要です。

◎質問者からの返答

知らなかったです。

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

ありがとうございます。

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

カッコ消しました

関連質問

●質問をもっと探す●



0.人力検索はてなトップ
8.このページを友達に紹介
9.このページの先頭へ
対応機種一覧
お問い合わせ
ヘルプ/お知らせ
ログイン
無料ユーザー登録
はてなトップ