【问题标题】:SQL | Update multiple rows with one querySQL |一次查询更新多行
【发布时间】:2013-08-06 09:24:52
【问题描述】:

我有一个方法,必须更改大约 20 行。我为每个 ajax 传递一个像“14-33-61-10 ...”这样的字符串来保存一些行的顺序。 这是我的实际(工作)代码:

$explode = explode('--',$_POST['data']); // -> array('0'=>'8', '1'=>'4', '2'=> ... )
$i = 1;
foreach( $explode as $task ) {
    if( !is_int($task) ) continue;
    $exec = $project->exec("UPDATE tasks SET pos=$i WHERE rowid=". $task );
    $i++;
}

我的问题是,它需要大约 1 秒。 我的问题:有没有办法只用一个查询来编辑多行?

【问题讨论】:

  • 看看这个http://stackoverflow.com/questions/9346755/update-multiple-rows-in-1-column-in-mysql

标签: php sql sqlite sql-update


【解决方案1】:

当然,发送如下 SQL 字符串:

update  tasks 
set     pos =
        case rowid
        when 13 then 1
        when 33 then 2
        when 61 then 3
        when 10 then 4
        end
where   rowid in (13,33,61,10)

13-33-61-10(13,33,61,10) 的转换最好在PHP 中完成。

【讨论】:

  • @mr_app 基于代码“set_pos=$i”已经是增量的。尝试将更新语句放在“i++”之后
  • 好点,SQL sn-p 更新了。您也可以一次性发送多个更新语句update ...; update ...; update ...;
  • 谢谢。我尝试了“更新...,更新...”和您的解决方案。你的一个快 3 倍。
  • 太棒了,我从来不知道你可以在一个声明中进行更新。非常好。
【解决方案2】:

如果范围很短,那么我们可以使用 ID IN (ids) 参数。

UPDATE `profile` SET `app_status`=3  WHERE `id` IN (3,37,95,136,1087,1795,1817)

如果它很长并且我们知道该范围,那么让我们使用 BETWEEN value AND value 参数。

UPDATE `profile` SET `app_status`=3  WHERE `id` BETWEEN 3904 AND 3918

【讨论】:

    【解决方案3】:
    $explode = explode('--',$_POST['data']); // -> array('0'=>'8', '1'=>'4', ... )
    $i = 1;
    $sql = "";
    foreach($explode as $task)
    {
        if(!is_int($task)) continue;
        $sql .= "UPDATE tasks SET pos=$i WHERE rowid=$task;";
        $i++;
    }
    $project->exec($sql);
    

    【讨论】:

      猜你喜欢
      • 2013-08-08
      • 1970-01-01
      • 1970-01-01
      • 2016-06-04
      • 1970-01-01
      • 2016-12-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多