如何从几个MySQL字段中减去某个值?
How to minus from several MySQL fields a certain value?
我正在编写产品库存脚本。我有一个 MySQL table "products_stock":
id zid pid amount
1 123 321 1
2 124 321 5
4 124 566 7
3 125 321 10
所以,库存产品 id = 321 的总量是 16。有人用 pid=321 和 qty = 7 下订单。我需要一些 php-函数,它将从开始的列数量中减去 7从第一个 zid 开始,并更新 table products_stock 中的记录,以便它像这样处理:
id zid pid amount
1 123 321 0
2 124 321 0
4 124 566 7
3 125 321 9
我被困在这一点上了。
谢谢解答!
您可以通过从 products_stock table 和 subtract/update 值中逐个选择所有相关行来完成此操作,直到您需要的数量超过为止。
示例代码
// These are the inputs you will be getting.
$pid = 321;
$qty = 7;
// Fetch all the relevent rows using the below query statement.
$select_sql = "select * from products_stock where pid = {$pid} and amount > 0";
// This will return the below array.
$data = [
[
'id' => 1,
'zid' => 123,
'pid' => 321,
'amount' => 1,
],
[
'id' => 1,
'zid' => 124,
'pid' => 321,
'amount' => 5,
],
[
'id' => 1,
'zid' => 125,
'pid' => 321,
'amount' => 10,
],
];
$update_data = [];
// You can then loop through your rows to perform your logic
foreach ($data as $row) {
// Exit loop if qty is 0
if ($qty == 0) {
break;
}
$id = $row['id'];
$amount = $row['amount'];
// Subtract the required amount from qty.
$qty -= $amount;
$amount = 0;
// If extra qty was consumed, add back to the amount.
if ($qty < 0) {
$amount =+ ($qty * -1);
$qty = 0;
}
// Update you data here or the best practice would be to avoid sql in a loop and do a bulk update.
// You can do this based on your requirement.
// $update_sql = "update products_stock set amount = {$amount} where id = {$id}";
// Prepare date for bulk update
$update_data []= [
'id' => $id,
'amount' => $amount,
];
echo "Qty {$qty} | Amt {$amount} \n";
echo "--------\n";
}
// Bulk update all your rows
if (count($update_data) > 0) {
$this->db->update_batch('products_stock', $update_data, 'id');
}
echo "\n";
echo "Balance Qty ". $qty . "\n";
输出
Qty 6 | Amt 0
--------
Qty 1 | Amt 0
--------
Qty 0 | Amt 9
--------
Balance Qty 0
您可以尝试 运行 不同数量的相同代码。
这是您的用例的粗略逻辑,它将按预期工作。仍然可能有更好的方法以最佳方式做到这一点。
很高兴对您有所帮助。
我不使用 codeigniter,而是阅读有关如何执行 select operation
和 batch update
的文档。主要问题是让您的逻辑正确...您 select 该特定项目的所有产品条目,然后遍历并从订购的产品中减去每个产品的数量。
<?php
//your order
$orders = [
['id' => 321, 'qty' => 7],
['id' => 501, 'qty' => 20],
];
$data = [];
foreach($orders as $order) {
$items = $this->db->where('pid', $order['id']);
$order_qty = $order['qty'];
foreach($items as $item){
$item_qty = $item->amount - $order_qty;
if ($item_qty <= 0) {
// set amount to 0 because it is less than order quantity
$data[] = ['id' => $item->id, 'amount' => 0];
// Subtract amount from order quantity to get the remaining order
$order_qty = $order_qty - $item->amount;
} else {
//If amount is more than order quantity set to calculated amount
$data[] = ['id' => $item->id, 'amount' => $item_qty];
// update order to 0
$order_qty = 0;
}
//exit if order quantity is 0
if ($order_qty === 0 ){
break;
}
}
}
$this->db->update_batch('product_stock', $data, pid');
我正在编写产品库存脚本。我有一个 MySQL table "products_stock":
id zid pid amount
1 123 321 1
2 124 321 5
4 124 566 7
3 125 321 10
所以,库存产品 id = 321 的总量是 16。有人用 pid=321 和 qty = 7 下订单。我需要一些 php-函数,它将从开始的列数量中减去 7从第一个 zid 开始,并更新 table products_stock 中的记录,以便它像这样处理:
id zid pid amount
1 123 321 0
2 124 321 0
4 124 566 7
3 125 321 9
我被困在这一点上了。 谢谢解答!
您可以通过从 products_stock table 和 subtract/update 值中逐个选择所有相关行来完成此操作,直到您需要的数量超过为止。
示例代码
// These are the inputs you will be getting.
$pid = 321;
$qty = 7;
// Fetch all the relevent rows using the below query statement.
$select_sql = "select * from products_stock where pid = {$pid} and amount > 0";
// This will return the below array.
$data = [
[
'id' => 1,
'zid' => 123,
'pid' => 321,
'amount' => 1,
],
[
'id' => 1,
'zid' => 124,
'pid' => 321,
'amount' => 5,
],
[
'id' => 1,
'zid' => 125,
'pid' => 321,
'amount' => 10,
],
];
$update_data = [];
// You can then loop through your rows to perform your logic
foreach ($data as $row) {
// Exit loop if qty is 0
if ($qty == 0) {
break;
}
$id = $row['id'];
$amount = $row['amount'];
// Subtract the required amount from qty.
$qty -= $amount;
$amount = 0;
// If extra qty was consumed, add back to the amount.
if ($qty < 0) {
$amount =+ ($qty * -1);
$qty = 0;
}
// Update you data here or the best practice would be to avoid sql in a loop and do a bulk update.
// You can do this based on your requirement.
// $update_sql = "update products_stock set amount = {$amount} where id = {$id}";
// Prepare date for bulk update
$update_data []= [
'id' => $id,
'amount' => $amount,
];
echo "Qty {$qty} | Amt {$amount} \n";
echo "--------\n";
}
// Bulk update all your rows
if (count($update_data) > 0) {
$this->db->update_batch('products_stock', $update_data, 'id');
}
echo "\n";
echo "Balance Qty ". $qty . "\n";
输出
Qty 6 | Amt 0
--------
Qty 1 | Amt 0
--------
Qty 0 | Amt 9
--------
Balance Qty 0
您可以尝试 运行 不同数量的相同代码。
这是您的用例的粗略逻辑,它将按预期工作。仍然可能有更好的方法以最佳方式做到这一点。
很高兴对您有所帮助。
我不使用 codeigniter,而是阅读有关如何执行 select operation
和 batch update
的文档。主要问题是让您的逻辑正确...您 select 该特定项目的所有产品条目,然后遍历并从订购的产品中减去每个产品的数量。
<?php
//your order
$orders = [
['id' => 321, 'qty' => 7],
['id' => 501, 'qty' => 20],
];
$data = [];
foreach($orders as $order) {
$items = $this->db->where('pid', $order['id']);
$order_qty = $order['qty'];
foreach($items as $item){
$item_qty = $item->amount - $order_qty;
if ($item_qty <= 0) {
// set amount to 0 because it is less than order quantity
$data[] = ['id' => $item->id, 'amount' => 0];
// Subtract amount from order quantity to get the remaining order
$order_qty = $order_qty - $item->amount;
} else {
//If amount is more than order quantity set to calculated amount
$data[] = ['id' => $item->id, 'amount' => $item_qty];
// update order to 0
$order_qty = 0;
}
//exit if order quantity is 0
if ($order_qty === 0 ){
break;
}
}
}
$this->db->update_batch('product_stock', $data, pid');