«« Cyclemeterで自転車ログを計測して眺めてみるのは面白い | 簡易商品申込ページをメールフォームで作る際、オプションをカスタマイズできるようにするなら「jquery.add-input-area」が使えそう »»
リレーションデータベース内に、メンバーと作業量のテーブルがあり、作業量のテーブルには、各メンバーがキーになってます。
作業量テーブルでは、同じメンバーのデータが登録日時は別で多重に挿入されている事もあります。詳しくは下表参照。
・メンバーテーブル
メンバーID | 名前 | 特徴 |
2 | 若林 妙子 | 義妹。 |
3 | 小日向 あゆ | 真面目に朝から晩までバイトしている。 |
50 | 神崎 麻衣 | 生徒に人気の養護教諭。 |
・作業量テーブル
メンバーID | 日時 | 作業量 |
50 | 08:30 | 3 |
3 | 09:20 | 5 |
2 | 10:50 | 1 |
50 | 11:11 | 2 |
さてメンバー毎の作業総量をコードで出す場合、どう組めば効率よく計算出来るでしょう?
そんな課題へ取り組む場合、DBからselect文から配列に取り込んだ後、うっかりするとこんなコードを書いてしまいます。
※言語は適当ですのでツッコミ禁止です。
for i = 0 to count(メンバー) 作業量[j].総作業量 = 0; for j = 0 to count(作業量) If (メンバー[i].メンバー===作業量[j].メンバー ) { 作業量[j].総作業量 += 作業量[j].作業量; } next next
このコードがアレなのは、メンバー×作業量分の処理が必要で、それぞれが多い場合処理が爆発的に必要になってしまうんですよね。
しかもその大半が何もしない処理で大変無駄。
そこで連想配列!
活用することで、if文否定による無駄を省くすることが出来ます。
for i = 0 to count(メンバー) 総作業量["メンバー[i].メンバーID"]=0; next for i = 0 to count(作業量) 総作業量["作業量[i].メンバーID"]+=作業量[i].作業量; next
こうすると処理する回数が、メンバー+作業量になりますので、大幅に減ります!
オススメです!
でも、よく考えたらこのぐらいの処理なら最初からSQLのsumとgroup by使って直接やらせた方が圧倒的に早い...。
select メンバーID,sum(作業量) from 作業量テーブル group by メンバーID
※メンバーテーブルの名前は、「ギャルゲーヒロイン自動生成」から拝借しました。
投稿者 kuze : 2015年8月 8日 22:10
«« Cyclemeterで自転車ログを計測して眺めてみるのは面白い | 簡易商品申込ページをメールフォームで作る際、オプションをカスタマイズできるようにするなら「jquery.add-input-area」が使えそう »»
コメント