首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >MySQL使用具有多个返回行的子查询更新字段值

问MySQL使用具有多个返回行的子查询更新字段值
EN

Stack Overflow用户
提问于 2010-12-11 05:23:08
回答 2查看 3.3K关注 0票数 0

我有两张表“银行”和“债券”。每个用户都有一个银行记录,但可以有0、1或更多的债券记录。

我想写一个脚本,用用户可能持有的多个债券的利息更新“银行”表中的“现金”字段。利息由“债券”表中的issuePrice *息票字段计算。但由于用户可能持有多个债券,因此它应该为每个债券执行此操作。

当时,我尝试了这样的方法:

代码语言:javascript
复制
$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。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2010-12-11 07:20:22

确保UPDATE语句只更新每个用户的行一次可能是值得的。子查询是实现这一点的最佳方法,它最有效地实现为连接表:

代码语言:javascript
复制
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)

(对于更多的优化,可能应该删除低位调用和轮调用,但这是另一种讨论。)

票数 1
EN

Stack Overflow用户

发布于 2010-12-11 05:47:09

最直接的方法是使用子选择和单独更新字段...

代码语言:javascript
复制
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
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/4413436

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档