2014-12-29 19 views
1

我試圖將表上的所有行更新爲基於LIMIT的for循環的迭代值,以便更新將在批處理中完成。我從帖子update multiple rows using limit in mysql?的建議中得到了一個提示,但它似乎給了我一個問題。該表有2400多行,相關字段具有全0值。這裏是我的代碼:MySQL:使用選擇和限制來更新行

for($i = 0;$i < 7; $i++) { 
    $qq2_ = $db1->prepare("UPDATE ledum_orgs SET ledum_org_size = :val WHERE ledum_org_size IN (
          SELECT ledum_org_size FROM (
           SELECT ledum_org_size FROM ledum_orgs WHERE ledum_org_size = '0' 
           ORDER BY ledum_org_name ASC 
           LIMIT ".($i*400).", 400 
          ) tmp 
         )" 
         ); 
    $qq2_->bindValue(':val',$i); 
    $qq2_->execute(); 
    echo $i."=>".$qq2_->rowCount().", "; 
} 

但它似乎忽略LIMIT子句,設置現場爲所有2445行到「1」。下面是輸出:

0 => 0,1 => 2445,2 => 0,3 => 0,4 => 0,5 => 0,6 => 0,

誰能告訴我爲什麼這樣做?

回答

0

在MySQL中,您不能在與in一起使用的子查詢中使用limit。您也不能參考在子查詢中更新的表(不使用join)。你可以,但是,這種切換到join

UPDATE ledum_orgs lo JOIN 
     (SELECT ledum_org_size 
     FROM ledum_orgs 
     WHERE ledum_org_size = '0' 
     ORDER BY ledum_org_name ASC 
     LIMIT ".($i*400).", 400 
     ) tmp 
     ON tmp.ledum_org_size = lo.ledum_org_size 
    SET lo.ledum_org_size = :val; 

這是可能的,可以簡化這:

UPDATE ledum_orgs lo 
    SET lo.ledum_org_size = :val 
    WHERE ledum_org_size = '0' 
    ORDER BY ledum_org_name ASC 
    LIMIT ".($i*400).", 400