プロが教えるわが家の防犯対策術!

「点数A」「点数B」というカラムの計算結果を「ポイント」カラムに格納したい場合、どのような方法があるのでしょうか。

たとえば以下のようなデータを格納する場合

・計算内容
ポイントカラムに点数A÷100+点数Bを入力。点数Bが80以上なら更に50ポイント追加

点数A 点数B ポイント
10000  100  250
10000  70   170
9000   80   220

現在、フォームから点数A、点数Bを入力し、PHPで
ポイント=点数A/100+点数B
if(点数B>=80) ポイント=ポイント+50
と計算してから、INSERTしています。(実際にはもう少し複雑な式ですが)

しかし、これではいずれポイント算出式に変更があった場合、
再度点数A、点数Bを全て取得して計算し直してからポイントに格納しなおす…という操作が必要になりますよね。
また、これではPHPを介さずに直接データベースの点数を入力する場合は、自力で計算しなければいけません。

もっとうまくやる方法は無いでしょうか?


excelでやっていた時は計算式を変えて全行ペーストすれば一瞬で反映されましたが、
MySQLでこういった計算結果の格納はどのようにするのが良いでしょうか?
よろしくお願いいたします。

A 回答 (1件)

はじめまして。



私もExcelからPHP+MySQLへの移動組です。
どちらにも長所がありますよね。
MySQLはExcelのように数式を埋め込んでおけるデータベースではありません。

今現在、fanta350mlさんはフォームに入力された点数A,点数Bを、MySQLにPHPを介してINSERTされているのですね。
それで、ご希望はPHPを介さずに直接データベースの点数を入力する、でいいのかな。

直接データベースに点数A,点数Bを入力するのにはMySQLコマンドまたはMySQL Query Browserなどのツールを使われると予想して回答します。

テーブル名 tableA
点数A pointA
点数B pointB
ポイント pointC としますと、
まず、INSERT INTO tableA (pointA,pointB) VALUE (10000,100),(10000,70),(9000,80);
のようにMySQLコマンドで点数A,点数Bを入力します。
この段階でポイントカラムは空です。
次に
UPDATE tableA SET pointC= ROUND( pointA / 100) + pointB + CASE WHEN pointB >=80 THEN 50 ELSE 0 END;
でポイントカラムに計算結果を入れてやるといいのでは。
PHPも使わずにすみます。

ROUND()で四捨五入の処理を追加しています。
CASE WHEN ~以下で点数Bで80点以上取得した際のみボーナスポイント50点を足してやる処理をしています。
変更後は条件に合わせてこの部分を書き換えてやればいいと思います。
点数に一部変更が出ても一行走らせるだけなのでラクです。

PHPでループを組んでもいいかと思ったのですが確かにMySQLのほうが処理は高速ですね。10万件は一瞬で終わります。

これがfanta350mlさんのご希望にそった回答だといいなと思っていますが、的外れならごめんなさい。
補足してくだされば追加で答えます!

この回答への補足

すいません、説明足らずでした。入力に関しては
・基本はPHPで入力する。
・直接データベースに入力することは、稀にある。

一番質問したい部分は
・ポイント計算式に変更が入る(結構入りそう…)ことを想定して、どのような方法で計算するのが良いか?
ということでした。
excel関数のように自動で他のカラムから引っ張ったり出来るのだろうか?と思いましたが、流石にそれは難しいようですね。

しかしTarepanda_clubさんのやり方なら、計算に変更が入った場合は、既に入ってるデータはSQLでUPDATEすれば良さそうですね。
ありがとうございます。まずはこの方法で作ってみようと思います。

もし他にも何か良いやり方があればご教示お願いします。

補足日時:2012/04/08 00:04
    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!