【问题标题】:SQL UPDATE in a loop ( mysql , PHP )循环中的 SQL UPDATE ( mysql , PHP )
【发布时间】:2014-02-26 10:15:12
【问题描述】:

我有两张桌子:

订单:

日期 |产品 |数量

01/03| P1 | 2

01/03| P2 | 2

02/03| P1 | 3

02/03| P2 | 1

02/03| P3 | 5

库存:

采购编号 |产品 |数量

01/03 | P1 | 4

01/03 | P2 | 1

02/03 | P2 | 2

02/03 | P3 | 5

02/03 | P1 | 1

02/03 | P1 | 1

第一个表是我的订单(我卖的),我想用这张表更新第二个表(这是我的库存)以准确了解我的库存。 但我想在日期之后这样做,我首先在 02/03 之前更新 Quantity.Stock 01/03 。 现在我有一个循环,问题是我不想有任何“-1”,我不想用相同的数据更新所有行。 在这个例子中,我有 5 个 P1 以备存货,因此 P1 的第一行必须是 0 ,下一个 P1 行也必须是 0 但最后一行必须保持在 1 。

有什么想法吗?还是方向?

布鲁诺

【问题讨论】:

    标签: php mysql sql loops sql-update


    【解决方案1】:

    我想 date 和 purchase_number 是某种日期时间值。 获取您尚未使用的订单。我想你有一些使用/处理的列或表,你将它们保存为标记。

    SELECT id, product, quantity
    FROM orders
    WHERE used = 0 AND quantity > 0
    ORDER BY date ASC
    

    按照您想使用的顺序获取您可以使用的所有相关购买,因此从最旧的开始。

    SELECT id, product, quantity
    FROM stock
    WHERE quantity > 0
    ORDER BY purchase_number ASC
    

    然后您可以反复标记订单并更新购买。我假设您将结果分别保存到 $orders 和 $purchases。

    foreach ($orders as $order) {
        $remaining = $order['quantity'];
    
        foreach ($purchases as &$purchase)
            if ($order['product'] !== $purchase['product']
                || $purchase['quantity'] === 0) {
                continue;
            }
    
            $remaining = $purchase['quantity'] - $remaining;
            $purchase['quantity'] = max($remaining, 0);
    
            // update purchase, where
            //     :quantity is $purchase['quantity']
            //     :id is $purchase['id']
            // UPDATE stock SET quantity = :quantity WHERE id = :id
    
            if ($remaining >= 0) {
                break;
            }
    
            $remaining = -$remaining;
        }
        unset($purchase);
    
        if ($remaining > 0) {
            // we have problem, we sold more, then we have in stock
        }
    
        // mark order as used, where :id is $order['id']
        // UPDATE orders SET used = 1 WHERE id = :id
    }
    

    示例的时间复杂度为 O(M*N),其中 M 是订单,N 是采购。当您按产品对数据进行分组并对购买或某些预处理进行 M SQL 查询时,您可以将其更改为 O(M+N)。它具有 O(M+N) 的内存复杂度,这是对较少查询的权衡。

    【讨论】:

      猜你喜欢
      • 2014-05-26
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-12-28
      • 1970-01-01
      • 2011-11-30
      • 2016-10-25
      • 1970-01-01
      相关资源
      最近更新 更多