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 個のクエリです。

これをすべて1つのクエリで行う方法があるかどうか疑問に思っていましたか?

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」演算子を使用します - ユーザー セット order = ($position+1) を更新します。

于 2012-09-16T13:56:49.503 に答える