mysql:14103
From: Hisamitsu Issei <Hisamitsu Issei <ds1i-hsmt@xxxxxxxxxx>>
Date: Mon, 9 Jul 2007 21:19:31 +0900
Subject: [mysql 14103] Re: ログのカウント方法
久光です > (2)count関数中にcase式を入れて、一度で複数の日付の範囲を > 集計できるようにしま > す。 > count(case when dt between '2007-03-01 00:00:00' and '2007-03-31 > 23:59:59' then 1 else null end) as a1, > from material left join log_mate on material.id=log_mate.mate_id > and dt between '2007-1-31 0:0:0' and '2007-7-31 23:59:59' group by > id,name order by id,name ; ・CASEを使って条件に合うものを別個に集計する方法 ・FROMの中に日付の絞り込みも入れてしまう方法 CASEはここで使えることが思いつかなかったです。言われてみ れば使えま すねコレが。FROMにいたってはこんな形で絞り込む条件が入れら れるとは知 りませんでした。 で、さっそく試してみたのですが、3時間ほど計算しても実行 結果が返っ てこなかったです。SQL文が間違ってたのかと思い、あれやこれ や試したん ですが全然実行結果が返ってこず。 ログファイルが大きすぎるのかもしれないと思って、79万行あ るデータを 今年の6月30日〜7月1日の2日間だけの 2600行に減らして、さらにSQL文を下 記のように単純にしたところ SELECT material.id, COUNT( CASE WHEN log_mate.datetime BETWEEN '2007-06-30 00:00:00' AND '2007-06-30 23:59:59' THEN 1 ELSE NULL END ) AS a1 FROM material LEFT JOIN log_mate ON material.id = log_mate.mate_id AND test.datetime BETWEEN '2007-6-29 0:0:0' AND '2007-7-1 23:59:59' GROUP BY material.id ORDER BY material.id 130秒くらいでようやく実行結果が返ってきました。結果は私 が欲しがっ ていたとおり、利用がなければ「0」が返ってくる部品一覧表に なっていま した。すごいです。ありがとうございました。 こんどの問題は実行時間が非常に長い点です。自分のパソコン (CoreDuo 2GHz)の処理能力がひどく劣っているとも思えないし、でもSQL 文はちゃん と動作することがわかったので、まずは気長に一晩くらい回しっぱなし にし てみます。EXCELにペタペタ貼付けてエッサホッサと行のずれを 揃える仕事 を考えれば、一晩ほっといて結果一覧がでる方がかなり効率的なので。 あとはSQL一発ってわけにはいかないけどテンポラリー・テー ブルを組み 合わせる方法も現実的な速度でPHPを使わずに一覧表が作れるか もしれない と考えてます。 なんにせよおかげさまで進歩しました。ありがとうございます。 ================================= == HISAMITSU ISSEI == == DS1I-HSMT@xxxxxxxxxx == http://www.ne.jp/asahi/pro/his/ =================================
14100 2007-07-08 16:41 [Hisamitsu Issei <ds1] ログのカウント方法 14101 2007-07-08 19:04 ┣["F.Y" <fumi_sby@xxxx] 14102 2007-07-08 21:14 ┗[忠犬 KEN公 <ken_ken_] -> @ 14103 2007-07-09 21:19 ┗[Hisamitsu Issei <ds1] 14104 2007-07-09 21:55 ┣["F.Y" <fumi_sby@xxxx] 14106 2007-07-10 11:35 ┗[hama <smilestyle55@x]