[PHP-users 30095] 日付別の数値をcsvで出力するには

大塚 哲治 goroneko @ pop17.odn.ne.jp
2006年 8月 19日 (土) 23:57:56 JST


大塚と申します。
#昨日回答いただいた小林さん、goungounさんありとうございます。
一難去ってまた一難。悩んでいます。聞いてばっかりで申し訳ありません。

前回と同様PHP+SQL ServerでWEBデータベースを構築しています。

テーブルには

日付     |    素材     |     カウント
-------+----------+----------
5/10     |       A        |   100
5/12     |       A        |   200
5/15     |       A        |   10
5/10     |       C        |   10
5/13     |       B        |   30
5/15     |       D        |   400

のようにデータが入っています。このデータをPHP+SQLを使って

      5/10,     5/11,     5/12,     5/13,     5/14,     5/15
A,    100,         0,       200,         0,          0,       ,10
B,      0,          0,         0,         30,          0,       ,0
C,     10,         0,         0,          0,          0,       ,0
D,      0,         0,         0,         0,          0,       ,400
のように「,(カンマ)」区切りのcsvで出力させてたいと思っています(スペースは無視してください)。
また、同じ日付の素材の行はありません。つまり重複は考えなくてもいいです。
値が0になっている所はテーブルの中にデータとして入っていない箇所です。

私の考えた方法は、
1. 素材のGroup byでselectし、配列hairetuにに代入。
2. 日付を配列で作っておく。ここではhiduke=("5/10","5/11","5/12","5/13","5/14","5/15")
3. hairetuとhidukeで二重ループを行う。
4. select カウント from default_table where 配列="A",日付="5/10"
 のようにSQLを実行し、もし値がなければ0を出力。値があればその値を出力
5. ","を出力。5/15までループしたら次の素材へ

とプログラミングしています。しかし、4のSQLを何度も検索するせいか量が多くなってくるとかなり表示まで時間がかかります。

スピードアップを考えています。

例えば、素材Aの検索で一度のSQLで
count["5/10"]=100
count["5/11"]=0
count["5/12"]=200
count["5/13"]=0
count["5/14"]=0
count["5/15"]=10
みたいな連想配列に入れられないでしょうか?一度のSQLで実行できるとスピードアップも期待できると思います。

他にいい方法があればそれも教えてください。

何度も質問ばかりで申し訳ありません。ご回答をお待ちしています。



PHP-users メーリングリストの案内