在没有ID迭代的情况下更新整个表

时间:2015-03-18 14:01:49

标签: mysql sql sql-update

注意:这一切都是在测试环境中完成的

问题
我有3张桌子 - 发票
- 产品
- 他们之间的联系

现在我需要使用产品中的一些值来更新每张发票。

问题
如果不迭代ID

,我怎么能这样做

到目前为止我尝试了什么
1.SELECT我需要的数据

SELECT INV.id, INV.to_update, SUM(PRO.update_from)
FROM invoices INV
LEFT JOIN connecting CNN ON CNN.id_inv=INV.id
LEFT JOIN products PRO ON PRO.id = CNN.id_prod
GROUP by INV.id;

它会显示正确的值 enter image description here

2.更新迭代槽ID(PHP / C#或其他语言)

UPDATE invoices INV SET INV.to_update=
  (SELECT SUM(PRO.update_from) 
  FROM connecting CNN 
  LEFT JOIN products PRO ON PRO.id=CNN.id_prod 
  WHERE CNN.id_inv="+id+") 
WHERE INV.id="+id+"

问题
我不能使用任何"循环"形成PHP,或c#或任何其他语言。我需要在SQL中做到这一点。那么有没有办法在SQL中执行此操作而无需选择所有ID的发票,并通过它们进行迭代?

解释和表格
我被迫在这个数据库上工作。每个产品都有update_from列,并带有值。我需要汇总此发票中所有产品的所有值,并将此SUM放入发票列之一(如果将来update_from更改了产品,则需要保留相同的发票。

重要的栏目:
发票:ID, to_update //需要将SUM放入该列
正在连接:ID, id_prod, id_inv //产品ID和发票ID 产品:ID, update_from //需要SUM

当然,1张发票可能有很多产品,因此" SUM" update_from

2 个答案:

答案 0 :(得分:2)

您可以使用SQL代码完成所需的更新:

UPDATE invoices 
    JOIN connecting 
        ON invoices.id = connecting.id_inv
    JOIN products 
        ON products.id= connecting.id_prod
    SET invoices.to_update= SUM(products.update_from) 

注意:我不确定你可能需要使用ifnull的left join,而不是join,取决于你的数据,你可以检查它

答案 1 :(得分:-1)

UPDATE  invoices
SET     to_update = (
        select   sum(p.update_from)
        FROM    invoices i2 join connecting c on c.id_inv = i2.id
                join products p on p.id = c.id_prod
        where   i2.id = invoices.id)