Php 如何更新与另一行具有相同值的特定行?
我很难弄明白这一点。我有一个数据库,它迟早会变大,看起来是这样的Php 如何更新与另一行具有相同值的特定行?,php,mysql,sql,Php,Mysql,Sql,我很难弄明白这一点。我有一个数据库,它迟早会变大,看起来是这样的 est_id |mat_id | est_qty | qty_rec 2 | 29 | 50 | 0 3 | 29 | 70 | 0 8 | 29 | 100 | 0 现在,我想完成的是更新一行,直到est_qty和qty_rec相等,然后移动到另一行。我开始编写代码,但它不起作用 foreach($mat_id as $mat
est_id |mat_id | est_qty | qty_rec
2 | 29 | 50 | 0
3 | 29 | 70 | 0
8 | 29 | 100 | 0
现在,我想完成的是更新一行,直到est_qty和qty_rec相等,然后移动到另一行。我开始编写代码,但它不起作用
foreach($mat_id as $mat_id_key => $mat){
while($rec_qty > 0){
$remBal = $est_qty[$mat_id_key] - $qty_rec[$mat_id_key];
if(($remBal - $rec_qty) >= 0){
mysql_query('UPDATE `estimates` SET `qty_rec` = `qty_rec` + '.$rec_qty.' WHERE `proj_id` = "'.$proj_id.'" AND `mat_id` = "'.$mat[$mat_id_key].'"');
}
}
}
在这段代码中,每一行都将进入循环,直到它满足条件,即est_数量和$rec_数量之间的差值大于或等于零,它将更新该行
例如,用户输入30作为$rec_数量,数据库现在将如下所示:
est_id |mat_id | est_qty | qty_rec
2 | 29 | 50 | 30
3 | 29 | 70 | 0
8 | 29 | 100 | 0
est_id |mat_id | est_qty | qty_rec
2 | 29 | 50 | 50
3 | 29 | 70 | 20
8 | 29 | 100 | 0
当用户第二次输入时,例如40作为$rec_qty,数据库现在将如下所示:
est_id |mat_id | est_qty | qty_rec
2 | 29 | 50 | 30
3 | 29 | 70 | 0
8 | 29 | 100 | 0
est_id |mat_id | est_qty | qty_rec
2 | 29 | 50 | 50
3 | 29 | 70 | 20
8 | 29 | 100 | 0
因为您的表没有唯一的id,所以您的更新将更新所有与proj_id和mat_id匹配的行
mat_id | est_qty | qty_rec
29 | 50 | 30
29 | 70 | 0
29 | 100 | 0
再加上40,您将得到:
mat_id | est_qty | qty_rec
29 | 50 | 70
29 | 70 | 70
29 | 100 | 70
甚至:
mat_id | est_qty | qty_rec
29 | 50 | 40
29 | 70 | 40
29 | 100 | 40
…取决于最先找到的行
将主键添加到表中,然后根据此ID更新记录。因为表没有唯一的ID,更新将更新与项目ID和物料ID匹配的所有行。因此,如果从以下开始:
mat_id | est_qty | qty_rec
29 | 50 | 30
29 | 70 | 0
29 | 100 | 0
再加上40,您将得到:
mat_id | est_qty | qty_rec
29 | 50 | 70
29 | 70 | 70
29 | 100 | 70
甚至:
mat_id | est_qty | qty_rec
29 | 50 | 40
29 | 70 | 40
29 | 100 | 40
…取决于最先找到的行
向表中添加主键,然后根据此ID更新记录。您不需要循环。这两个查询就足够了:
mysql_query("set @remain := $rec_qty");
mysql_query(
"update estimates
set qty_rec = @remain,
qty_rec = qty_rec - (@remain := if( qty_rec > est_qty, qty_rec - est_qty, 0)
where mat_id = $matId
order by est_id"
);
$matId是您要更新的mat\u id。您不需要循环。这两个查询就足够了:
mysql_query("set @remain := $rec_qty");
mysql_query(
"update estimates
set qty_rec = @remain,
qty_rec = qty_rec - (@remain := if( qty_rec > est_qty, qty_rec - est_qty, 0)
where mat_id = $matId
order by est_id"
);
$matId是您要更新的mat_id。这里有一个基于集合的单个查询来完成此操作,尽管它使用了: 应该注意的是,这并没有处理溢出情况的逻辑,当您试图插入一个大于现有记录所能容纳的数字时,您可能需要插入一个新记录来保存剩余的数据
这里有一个SqlFiddle演示。这里有一个基于集合的单个查询来实现这一点,尽管它使用了: 应该注意的是,这并没有处理溢出情况的逻辑,当您试图插入一个大于现有记录所能容纳的数字时,您可能需要插入一个新记录来保存剩余的数据
有一个SQLFIDLE演示。您如何知道应用数量记录的顺序?最小到最大的est_数量?还有,这里的主键是什么?项目id?您可以显示所有列。这到底是涉及SQL Server还是仅仅涉及MySql?我个人并不了解应用程序本身。那么用户将qty_rec输入到表单中?因此,qty_rec的起始值为0。和est_数量是您预先确定的值吗?如果est数量=60,用户输入数量=70,该怎么办?我只是很困惑。@TimLehner,请回答更新的问题。est_id是主键。谢谢。:]@bowlerae,是的,用户在表单中输入。而且数量是我预先指定的。如果用户输入的数量高于预计数量,则10将转到下一行的记录数量,先生。您如何知道应用数量记录的顺序?最小到最大的est_数量?还有,这里的主键是什么?项目id?您可以显示所有列。这到底是涉及SQL Server还是仅仅涉及MySql?我个人并不了解应用程序本身。那么用户将qty_rec输入到表单中?因此,qty_rec的起始值为0。和est_数量是您预先确定的值吗?如果est数量=60,用户输入数量=70,该怎么办?我只是很困惑。@TimLehner,请回答更新的问题。est_id是主键。谢谢。:]@bowlerae,是的,用户在表单中输入。而且数量是我预先指定的。如果用户输入的数量高于预计数量,那么10将转到下一行的记录数量,先生。我之前忘了包括它。对不起。我编辑了表并添加了主键。好的,然后在UPDATE语句中使用est_id,您就可以开始了。我之前忘了包含它。对不起。我编辑了表格并添加了主键。好的,然后在更新声明中使用est_id,您就可以开始了。非常感谢您,先生。非常感谢您的帮助。:]非常感谢,先生。非常感谢您的帮助。:]