我有一个简单的数组。
$a = array(
array('id' => 2, 'year' => 2010),
array('id' => 3, 'year' => 2011)
);
我有一个带有id
主键的MySQL表。现在我像这样更新我的表:
foreach ($a as $v) {
$db->update($v, array('id = ?' => $v['id']));
}
我的$a
包含3700行。我需要创建一个大查询而不是循环。怎么办?先感谢您。抱歉我的英文。
答案 0 :(得分:7)
您的询问通常不会发生,因为您通常会使用update()
将大量记录设置为具有相同的值,或将一条记录设置为具有许多不同的值。
解决这个问题的一种方法是汇总更新,因此使用您的数组获取2011年的所有ID,然后运行:
$where = array();
// This where should contain all the ids that need the year set to 2011
// E.g.
$where[] = array("id" => 3);
$db->update("table_name", array("year" => 2011), $where);
这样做会减少查询次数,假设您有多年同一行。相关文档为here。
或者您可以使用方法like this
OP响应后编辑
问题的本质意味着它无法有效解决。
您要求使用非常不同的数据集更新3,700行数据。如果数据集不同,那么就没有可以利用的模式来实现这种效果。查找模式,例如同年的行,并将它们用于您的优势将提高查询的速度,但需要以regilero所述的阵列混搭的形式进行大脑管理。
答案 1 :(得分:0)
这是关于how to update multiple rows quickly and easily的精彩文章。它通过聚合要在单独数组中设置的公共值,然后更新每个值来讨论崩溃多个更新语句到几个语句的方法:
$allIds = array();
foreach ($a as $item) {
$allIds[$item['year']][] = $item['id'];
}
foreach ($allIds as $year => $ids) {
$bind = array('year' => $year);
$where = $db->quoteInto('id IN (?)', $ids);
$db->update('table_name', $bind, $where);
}
如果没有或很少有常见值并且更新无法折叠到几个语句怎么办?在这种情况下,文章解释了以下方法: