2

質問を読む前にこの例を確認してください-http://www.sqlfiddle.com/#!2 / fcf3e/8

次のデータはフォームからのものであり、ユーザーは特別オファーから製品を削除しただけです。

Array(
    'special_offer_id' => 1,
    'product_ids' => Array(
        0 => 1,
        0 => 2
    )
)

もともと私はこのクエリを使用したかった...

REPLACE INTO `foo` VALUES (1, 1), (2, 1);

ただし、これはユーザーが削除した製品を削除するのではなく、他の製品を更新するだけです。

だから私は2つのクエリを実行することを余儀なくされています...

DELETE FROM `foo` WHERE `special_offer_id` = 1;
INSERT INTO `foo` VALUES (1, 1), (2, 1);

2つのクエリを実行せずにこれを行うためのより良い方法はありますか?

http ://www.sqlfiddle.com/#!2 / fcf3e / 8

4

1 に答える 1

1

MySQL内でDMLステートメントを組み合わせることができないと思います。OracleとMSSQLにこのためのマージ機能があることは知っていますが、MySQLにはこの機能がないと思いますが、それについてはよくわかりません。

あなたのフィドルとコードが実際に何をしているのかを見て、私は別のアプローチを思いついた。存在するデータの配列をループし、出力を1つの変数に入れ、deleteを使用して一致しない行を削除する場合。

sqlfiddleに基づく例を次に示します(配列はフィドルで正しく名前が付けられていないため、無効であることに注意してください)

// Declare var and fill with array result
$exists = '';

for ($c = 0; $c < count($array); c++)
{
    if ($c == (count($array) -1))
    {
      $exists .= $array[$c]['product_ids'];
    }
    else
    {
      $exists .= $array[$c]['product_ids'].',';
    }
}

次に、2つのクエリを実行する代わりに、1つのクエリで実行できます。

DELETE FROM `foo` WHERE `special_offer_id` NOT IN ('.$exists.');
于 2012-03-22T11:09:01.897 に答える