2010-12-10 125 views
0

我有兩個表「銀行」和「債券」。每個用戶都有銀行記錄,但可以有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個,它只增加500個,就像只有1個債券。如果我設置一個債券500利息和其他一家擁有1000計算利息,它突然增加了475

+2

轉換它到一個SELECT,並確認輸出是你所期望的 – 2010-12-10 21:26:42

回答

1

確保您的UPDATE語句嘗試一次更新每個用戶的行可能是值得的。子查詢是做到這一點的最好辦法,最有效的連接表來實現:

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

謝謝,這工作! – 2010-12-11 12:17:52

0

最簡單明瞭的方法是使用子查詢和更新單獨的領域...

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

這也工作得很好,但我認爲其他查詢更容易和更高性能。 – 2010-12-11 12:19:02