MySQL连接更新:两次更新连接表行

时间:2013-08-07 09:19:44

标签: mysql sql join sql-update

为了解释这个问题,我刚才概述了一个示例情况。

OrderRows

ID|OrderNumber|ProductNumber|Quantity|Done
1 |10         |100          |1       |no*
2 |10         |101          |1       |no
3 |10         |100          |4       |no*

*具有相同的产品编号

Stock
ProductNumber|Quantity
100          |5
101          |1

UPDATE OrderRows 
INNER JOIN Stock ON Stock.ProductNumber=OrderRows.ProductNumber 
SET Done='yes'
   ,Stock. Quantity = Stock. Quantity -OrderRows. Quantity 
WHERE OrderNumber='100' AND Done='no'

Stock的结果如下所示。

ProductNumber|Quantity
100          |4
101          |0

订单行已正确更新。但对于Order Row三,Stock不适应。这是因为订单行3与订单行1具有相同的产品编号。问题是,我该如何解决这个问题?

1 个答案:

答案 0 :(得分:0)

您需要在此处使用GROUP BY。但是我们不能直接使用它。所以你可以使用这样的子查询来实现这个目的:

UPDATE OrderRows o
  JOIN Stock s
    ON s.ProductNumber = o.ProductNumber
  JOIN 
     (
       SELECT ProductNumber, SUM(Quantity) AS Quantity
         FROM OrderRows 
        WHERE  Done = 'no'
        GROUP BY ProductNumber
     ) o1
   ON o.ProductNumber = o1.ProductNumber
  SET o.Done = 'Yes'
     ,s.Quantity = s.Quantity - o1.Quantity
 WHERE o.Done = 'no';

更新后的表格:

OrderRows

| ID | ORDERNUMBER | PRODUCTNUMBER | QUANTITY | DONE |
------------------------------------------------------
|  1 |          10 |           100 |        1 |  Yes |
|  2 |          10 |           101 |        1 |  Yes |
|  3 |          10 |           100 |        4 |  Yes |

股票

| PRODUCTNUMBER | QUANTITY |
----------------------------
|           100 |        0 |
|           101 |        0 |

请参阅this SQLFiddle