2010-12-10 129 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