4

Oracle ユーザーとして、MySql をいじって、この問題に頻繁に直面しています。

次の状況になります。

  • ID のリスト (1、2、3、...、n)
  • 値のリスト ('val1', 'val2', 'val3', ..., 'valn') [値は明らかにこれらとはまったく異なります]
  • 前の 2 つのリストは順番に渡されます。これは、最初に渡された値が最初に渡された id に対応することを意味します。

目的は、対応するすべてのvalueテーブルvalueを更新することidです: val1 は id 1 を更新する必要があり、val2 は id 2 を更新する必要があります... 1 つのクエリのみで。

簡単な解決策は、n 回更新することです。

UPDATE `value` SET `value`='val1' WHERE id = 1;
UPDATE `value` SET `value`='val2' WHERE id = 2;
UPDATE `value` SET `value`='val3' WHERE id = 3;
...
UPDATE `value` SET `value`='valn' WHERE id = n;

しかし、これをすべて一括更新したいと思います。

少し遊ぶためのsqlfiddle:http://sqlfiddle.com/#!2/d02e8

4

1 に答える 1

2

1 つのクエリを使用してこれを行う 1 つの方法を次に示します。これは最もきれいな形式のクエリにはなりませんが、ただ 1 つのクエリになります。

<?php

$id_list = implode(',', $ids);
$whens = implode(
    "\n    ",
    array_map(
        function ($id, $value) {
            return "WHEN {$id} THEN {$value}";
        },
        $ids,
        $values
    )
);

$sql = "
    UPDATE value
    SET value = CASE id
    {$whens}
    END
    WHERE id IN ({$id_list})
";
?>

私の変更されたSQLFiddleを参照してください。

于 2012-12-05T00:31:03.683 に答える