0

我有一个看起来像这样的数组:

array(
    [0] => 1
    [1] => 2
    [2] => 4
    [3] => 3
)

目前我正在遍历数组并按照以下方式运行单个更新

foreach($array as $position => $id){
   //query = update users set order = ($position+1) where id = $id
}

显然不是实际的代码,但它得到了重点,

如果我的列表中有 1000 个项目,那就是 1000 个查询,

我想知道是否有一种方法可以在一个查询中完成所有这些操作?

4

4 回答 4

3

您可以使用 MySQL 的 case 语句。我不确定它是否会更快,但它是如何工作的:

$query = 'UPDATE users SET order = CASE id ';
foreach($array as $position => $id) {
    $query .= 'WHEN '.$id.' THEN "'.($position+1).'" ';
}
$query .= 'ELSE order ENDCASE'; // leave order the same if the id doesn't match the array
// run $query...

MySQL CASE 语法

于 2012-09-16T13:50:37.530 回答
0

这实际上是可能的。您可以使用循环构建查询字符串以适合此示例

然后执行你的查询;)

于 2012-09-16T13:53:04.213 回答
0

假设id是主键或唯一键,您可以这样做:

$tmp = Array();
foreach($array as $position=>$id) {
    $tmp[] = "(".$id.",".($position+1).")";
}
$query = "INSERT INTO users (id,order) VALUES ".implode(",",$tmp)
    ." ON DUPLICATE KEY UPDATE order=VALUES(order)";
于 2012-09-16T13:56:32.427 回答
0

使用“in”运算符 - 更新用户 set order = ($position+1) where id in

于 2012-09-16T13:56:49.503 回答