【问题标题】:MySQL join update: Updating join table row twiceMySQL 连接更新:更新连接表行两次
【发布时间】:2013-08-08 14:21:30
【问题描述】:

为了解释这个问题,我在下面概述了一个示例情况。

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

订单行已正确更新。但是对于第三行,Stock 没有被调整。这是因为第三行订单的产品编号与第一行订单相同。问题是,我该如何解决这个问题?

【问题讨论】:

  • 正确更新后两个表的期望输出是什么?
  • @hims056 ` ID|OrderNumber|ProductNumber|Quantity|Done 1 |10 |100 |1 |yes 2 |10 |101 |1 |yes 3 |10 |100 |4 |yes' 产品编号|数量 100 |0 101 |0
  • @hims056 对于所有 OrderRows Done 必须为“是”并且产品编号 100 的库存应为 0
  • 我明白了。看我的回答。

标签: mysql sql join sql-update


【解决方案1】:

您需要在这里使用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';

更新后的表格:

订单行

| 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

【讨论】:

    猜你喜欢
    • 2012-01-10
    • 1970-01-01
    • 1970-01-01
    • 2014-08-19
    • 2018-02-11
    • 2011-12-24
    • 2018-12-14
    • 2020-04-04
    • 2019-08-07
    相关资源
    最近更新 更多