2010-12-10 10 views
0

私は2つのテーブル "銀行"と "債券"を持っています。各ユーザーには銀行レコードがありますが、0件、1件以上の債券レコードを持つことができます。MySQL複数の返信行を含むサブクエリでフィールド値を更新します。

「銀行」テーブルのフィールド「現金」を更新するスクリプトを、ユーザーが保持している複数の債券の利益とともに書きたいと考えています。関心は、債券テーブルのissuePrice * couponフィールドによって計算されます。しかし、ユーザーが複数の債券を保有する可能性があるため、債券ごとにこれを行う必要があります。現時点で

は、私はこのような何か試してみました:

$MySQL->db_Query("UPDATE bonds bo, bank ba SET 
     ba.cash = ROUND(ba.cash + (bo.issuePrice * bo.coupon), 2), 
     ba.earned = ROUND(ba.earned + (bo.issuePrice * bo.coupon), 2) 
    WHERE LOWER(ba.user) = LOWER(bo.holder) AND 
     LOWER(bo.holder) <> LOWER('Bank');"); 

をしかし、それは期待される結果を与えるものではありません。私は2つのボンドを持つユーザーと一緒に試しました。両方のボンドがそれぞれ500の利息を与えるべきなので、合計1000で、1つのボンドしかないように500を追加します。私は1000年の計算興味を持つ500利息およびその他の一つとして1個の結合を設定した場合、それは突然... 475

+2

変換それをSELECTにして、出力があなたが期待しているものであることを確認してください。 –

答えて

1

UPDATE文が各ユーザの行を一度正確に更新しようとしていることを確認することは、おそらく有益でしょう。サブクエリは、最も効率的に結合されたテーブルとして実装され、これを行うための最善の方法である:(より最適化のために、LOWERとROUND呼び出しはおそらく排除しなければならないが、それは別の議論だ。)

UPDATE bank 
JOIN (SELECT LOWER(bonds.holder) as user, 
    SUM(bonds.issuePrice * bonds.coupon) as total 
    FROM bonds 
    WHERE LOWER(bonds.holder) != 'bank' 
    GROUP BY user 
) as increments ON increments.user = LOWER(bank.user) 
SET bank.cash = ROUND(bank.cash + increments.total, 2), 
    bank.earned = ROUND(bank.earned + increments.total, 2) 

+0

ありがとう、これは働いた! –

0

最もstraighforward方法は、サブ選択を使用して、個別にフィールド更新することで追加

UPDATE bank ba1 
SET ba1.cash = ba1.cash + (ROUND(SELECT SUM(bo.issuePrice * bo.coupon) 
       FROM bank ba2 JOIN bonds bo ON bo.user = ba2.user 
       WHERE ba2.user = ba1.user), 2) 
... 
+0

これもうまくいきましたが、私は他のクエリがより簡単でより効果的だと思います。 –

関連する問題