2013-08-06 90 views
0

我有一個方法,其中約20行必須更改。每個Ajax傳遞一個字符串,如「14-33-61-10 ...」,以保存一些行的順序。 這裏是我的實際(工作)代碼:SQL |用一個查詢更新多行

$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秒鐘。 我的問題:有沒有辦法只用一個查詢編輯多行?

+0

檢查了這一點通過'http:// stackoverflow.com /問題/ 9346755 /更新多排合1列式,mysql' –

回答

3

當然,發送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完成。

+0

是。但pos必須增長(++)。 13 = 1,33 = 2,41 = 3 .... –

+0

@mr_app基於代碼「set_pos = $ i」已經是增量了。嘗試在「i ++」之後放置更新語句 – zxc

+0

好點,更新了SQL代碼段。您也可以一次發送多個更新語句'update ...;更新...;更新...;' – Andomar

-1
$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); 
0

如果範圍很短,那麼我們可以使用ID IN(ids)參數。

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

如果它很長並且我們知道該範圍,那麼讓我們使用BETWEEN值AND值參數。

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