Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/273.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 如何更新与另一行具有相同值的特定行?_Php_Mysql_Sql - Fatal编程技术网

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,您就可以开始了。非常感谢您,先生。非常感谢您的帮助。:]非常感谢,先生。非常感谢您的帮助。:]