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'].',';
    }
}

然后,您可以用一个来完成,而不是执行两个查询

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