8

我有一个采用以下形式的 SQL 查询:

UPDATE foo
SET flag=true
WHERE id=?

我还有一个包含 ID 列表的 PHP 数组。除了解析之外,完成此任务的最佳方法是什么,如下所示,...

foreach($list as $item){  
    $querycondition = $querycondition . " OR " . $item;  
}

...并使用WHERE子句中的输出?

4

8 回答 8

9

这将达到同样的效果,但可能不会产生太多的速度提升,但看起来更好。

mysql_query("UPDATE foo SET flag=true WHERE id IN (".implode(', ',$list).")");
于 2008-09-02T15:29:18.770 回答
5

您应该能够使用 IN 子句(假设您的数据库支持它):

UPDATE foo SET flag=true WHERE id in (1, 2, 3, 5, 6)

于 2008-09-02T15:27:12.457 回答
5

使用 IN 语句。提供逗号分隔的键值列表。implode您可以使用函数轻松地做到这一点。

UPDATE foo SET flag = true WHERE id IN (1, 2, 3, 4, 5, ...)

或者,您可以使用条件:

UPDATE foo SET flag = true WHERE flag = false

或子查询:

UPDATE foo SET flag = true WHERE id IN (SELECT id FROM foo WHERE .....)
于 2008-09-02T15:30:53.413 回答
1

使用 join/implode 创建一个以逗号分隔的列表,最终得到:

UPDATE foo SET flag=true WHERE id IN (1,2,3,4)
于 2008-09-02T15:29:02.887 回答
0

除了你的 foreach 循环之外,我还没有见过这样做的方法。

但是,如果 $list 以任何方式从用户那里获得,您应该坚持使用准备好的语句并且一次只更新一行(假设有人没有办法使用准备好的语句更新多行)。否则,您对 sql 注入持开放态度。

于 2008-09-02T15:27:25.903 回答
0

您可以使用案例语句来干扰您的更新,但您必须自己构建查询。

UPDATE foo
SET flag=CASE ID WHEN 5 THEN true ELSE flag END  
    ,flag=CASE ID WHEN 6 THEN false ELSE flag END 
WHERE id in (5,6)  

where 可以省略,但可以避免完整的表更新。

于 2008-09-02T15:29:18.893 回答
0

VB.NET 代码: dim delimitedIdList as string = arrayToString(listOfIds)

暗淡 SQL as string = " UPDATE foo SET flag=true WHERE id in (" + delimitedIdList + ")"

运行Sql(SQL)

于 2008-09-02T15:29:25.477 回答
0

如果您知道项目数量的限制,请使用“IN”子句,正如其他人所建议的那样:

UPDATE foo SET flag=true WHERE id in (1, 2, 3, 5, 6)

One warning though, is that depending on your db there may be a limit to the number of elements in the clause. Eg oracle 7 or 8 (?) used to have a limit of 256 items (this was increased significantly in later versions)
If you do iterate over a list use a transaction so you can rollback if one of the updates fails

于 2008-09-02T15:39:06.840 回答