我需要更新表中的几条记录,并希望在一个查询中完成它。
对于我表中的一些记录,我有一个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();
}
感谢。
答案 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();
}