使用增加的值更新数据库中的多个记录

时间:2011-08-03 21:15:35

标签: php mysql

我需要更新表中的几条记录,并希望在一个查询中完成它。

对于我表中的一些记录,我有一个id数组的php数组。该数组按特定顺序排列,我需要使用id在数组中的位置/键更新每个id的值。我可以轻松遍历数组中的每个值,并为每个需要更新的记录运行查询,但我正在寻找一种方法来在一个查询中更新每条记录。

以下内容将为我提供所需的结果,但我正在寻找一个查询解决方案

$ID = array('3','2','6','5','9');
for($i = 0; $i <= 4; $i++){
    $q = "UPDATE table SET blah = ".$i." WHERE id = ".$ID[$i];
    mysql_query($q) or die();   
}

感谢。

7 个答案:

答案 0 :(得分:1)

一个很长的丑陋的if或case声明可以解决这个问题:

UPDATE ...
SET blah = IF(id=3,1,IF(id=2, 2, IF(id=6,3, IF....))))
WHERE id IN (3,2,6,....)
它会迅速变得难以管理,但它会在单个查询中完成任务。更轻松,更便携的替代方案:

UPDATE
SET blah = CASE id WHEN 3 THEN 1 WHEN 2 THEN 2 WHEN 6 THEN 3 .... END CASE
WHERE id in (3,2,6,...)

答案 1 :(得分:1)

2个查询:

首先,只有在您已经使用@var时才需要。

SET @var := -1;

然后(注意FIND_IN_SET想要逗号分隔的字符串):

UPDATE tablename 
SET blah = @var := @var +1
WHERE id IN (3,2,6,5,9)
ORDER BY FIND_IN_SET(id,'3,2,6,5,9');

如果你有一个带有key =&gt; postition对的数组,可以使用它:

$array = array(2 => 40,3 => 12,5 => 8,6 => 9,9 =>13129);
mysql_query("
   UPDATE bla
   SET blah = ELT(
     FIELD(id,".implode(',',array_keys($array))."),
      ".implode(',',$array).")
   WHERE id IN (".implode(',',array_keys($array)).")");

答案 2 :(得分:1)

试试这个:

INSERT INTO tbl_name (idCol, valCol) VALUES (id1, value1),(id2, value2)
ON DUPLICATE KEY UPDATE
  idCol = VALUE(idCol),
  valCol = VALUE(valCol)

你也可以使用一个存储过程,传递一个ID的字符串:

CREATE PROCEDURE updateItems( firstNum INT NOT NULL, ids TEXT NOT NULL) BEGIN
   @id := ... #  Some expression to get the first ID.
   WHILE id != "" DO
      SET ids := ... #  Some expression to get the rest of the string.
      UPDATE table SET blah = firstNum WHERE id = @id;
      SET firstNum = firstNum +1;
      @id := ... ;
   END;
END $$

此外,LAST_INSERT_ID()还有一个技巧 - 如果您使用参数调用它,例如LAST_INSERT_ID( 123 ),则对LAST_INSERT_ID()的连续调用将为您提供123。 可与@variables一起使用以实现该目标。

你可能会在这里获得一些灵感:http://ondra.zizka.cz/stranky/programovani/sql/mysql_stored_procedures.texy

答案 3 :(得分:0)

以这种方式是不可能的...嗯,这是可能的,但我建议你不要这样做,5个查询不是恐怖

答案 4 :(得分:0)

$q = "UPDATE table SET blah = ".$i." WHERE id in ('3','2','6','5','9')";

答案 5 :(得分:0)

如果您担心性能问题,则应该查看使用预准备语句和事务。

最有可能在一个查询中执行此操作的解决方案,但它很可能会变得非常混乱。

答案 6 :(得分:0)

你最好使用foreach然后你不必设置$ i限制。 我认为它很快就这样做了

$id = array('3','2','6','5','9');
$i=0;

 foreach ($id as $v){

    $q = "UPDATE table SET blah = ".$i++." WHERE id = '$v'";
    mysql_query($q) or die();   

 }