【问题标题】:How do I update multiple data using single query?如何使用单个查询更新多个数据?
【发布时间】:2019-08-06 05:42:09
【问题描述】:

当 id_array 很大时,此查询需要很长时间才能运行。我怎样才能让它更快?是否可以在一个查询中执行此操作,而不是像我的示例中那样进行多次更新?

<?php
$sort = 1;
$id_array = array(
    56,
    14,
    99,
    54,
    8,
    92
);
foreach ($id_array as $id) {
    mysqli_query($conn, "UPDATE id_table SET sort = '$sort' WHERE id = '$id'");
    $sort++;
}
?>

【问题讨论】:

标签: php mysql


【解决方案1】:

传说在处理大型数据集时使用prepared statement 可以比其他类型的查询更快 - 这是否正确由您决定 - 但要使用准备好的语句,您可以尝试如下:

$sql='update id_table set sort = ? where id = ?';
$stmt=$conn->prepare( $sql );
$stmt->bind_param( 'ii', $sort, $id );

foreach( $id_array as $index => $id ){
    $sort=$index+1;
    $stmt->execute();
}

【讨论】:

    【解决方案2】:

    假设你有一个数组

    $id_array = array(56, 14, 99, 54, 8, 92);
    

    而你的 db driver 允许多个 sql 语句 您可以尝试使用 sql var a in 子句并避免循环(也避免引用数值)为 IN 子句构建正确的字符串

    $yourArray = implode(', ', $id_array);
    
    mysqli_query($conn, " set  @sort = 0;
     UPDATE id_table SET sort = @sort +1 WHERE id IN  ( ". $your_Array . ")");
    

    【讨论】:

    • 这里使用内部变量感觉不对,但也许只是一种感觉
    • 我无法让它工作。感觉像是一个简单的解决方案,但是当我运行这个查询时,排序并没有增加。
    【解决方案3】:

    这是我的最终解决方案。它工作得很好,比我第一次尝试要快得多。

    $sort = 1;
    $query = "UPDATE id_table SET sort = CASE ";
    foreach($id_array as $id)
        {
        $query = $query . "WHEN id = '$id' THEN '$sort' ";  
        $sort++;
        }
    $query = $query . "END";
    mysqli_query($conn, $query);
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-08-27
      • 1970-01-01
      • 1970-01-01
      • 2011-02-11
      • 1970-01-01
      相关资源
      最近更新 更多