MySQL加入更新: Updating join table row twice

标签 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

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

最佳答案

你需要在这里使用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

关于MySQL加入更新: Updating join table row twice,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18099467/

相关文章:

mysql - LOAD DATA INFILE 同一行有数百个警告

mysql选择动态行值作为列名如下

mySQL, 三张表 : UPDATE multiple rows (each with a different value)

mysql - 将两个 SELECT 语句组合成一个 JOIN

sql - mysql - 排序和左外连接问题

mysql - STR_TO_DATE 不存在

sql - 内部联接的唯一ID

sql - 从 MySQL 中的表的一部分中选择最小值和最大值

SQL 左连接与 FROM 行上的多个表?

mysql - 检查两个表中两行中是否存在数据