我有两张表“银行”和“债券”。每个用户都有一个银行记录,但可以有0、1或更多的债券记录。
我想写一个脚本,用用户可能持有的多个债券的利息更新“银行”表中的“现金”字段。利息由“债券”表中的issuePrice *息票字段计算。但由于用户可能持有多个债券,因此它应该为每个债券执行此操作。
当时,我尝试了这样的方法:
$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,就像只有一个债券一样。如果我将一个债券的利息设置为500,另一个债券的计算利息为1000,它会突然增加475。
发布于 2010-12-11 07:20:22
确保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)(对于更多的优化,可能应该删除低位调用和轮调用,但这是另一种讨论。)
发布于 2010-12-11 05:47:09
最直接的方法是使用子选择和单独更新字段...
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)
...https://stackoverflow.com/questions/4413436
复制相似问题