我想 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) 的内存复杂度,这是对较少查询的权衡。