插入&;无需多次查询即可删除MySQL数据库中的行

插入&;无需多次查询即可删除MySQL数据库中的行,mysql,query-optimization,sql-insert,sql-delete,Mysql,Query Optimization,Sql Insert,Sql Delete,在阅读问题之前检查此示例- 以下数据来自一个表单,用户只需从特价中删除一个产品 Array( 'special_offer_id' => 1, 'product_ids' => Array( 0 => 1, 0 => 2 ) ) 最初我想使用这个查询 REPLACE INTO `foo` VALUES (1, 1), (2, 1); 但这不会删除用户删除的产品,只会更新其他产品 所以我不得不执行两个查询 DELE

在阅读问题之前检查此示例-

以下数据来自一个表单,用户只需从特价中删除一个产品

Array(
    'special_offer_id' => 1,
    'product_ids' => Array(
        0 => 1,
        0 => 2
    )
)
最初我想使用这个查询

REPLACE INTO `foo` VALUES (1, 1), (2, 1);
但这不会删除用户删除的产品,只会更新其他产品

所以我不得不执行两个查询

DELETE FROM `foo` WHERE `special_offer_id` = 1;
INSERT INTO `foo` VALUES (1, 1), (2, 1);
有没有更好的方法不必执行两次查询就可以做到这一点


示例

我认为在MySQL中不可能组合DML语句。我知道Oracle和MSSQL有这个合并功能,但我认为MySQL没有这个功能,但我不太确定

看看你的小提琴和代码的实际功能,我想出了一个不同的方法。如果您循环当前的数据数组,并将输出放入1个变量中,然后使用delete删除不匹配的行

下面是一个基于sqlfiddle的示例(请注意,数组无效,因为它在fiddle中没有正确命名)


多个查询有什么问题?也许最好的方法是使用存储过程。它们没有问题,我只是想知道是否有一种更可取的方法。为什么您认为REPLACE不会删除记录?使用SELECT ROW\u COUNT()查询选中此项。您的PK是复合密钥(product\u id,special\u offer\u id)。因为
替换为
只会
更新数组中的两条记录,而忽略已删除的记录。替换语句首先检查唯一字段(
product\u id
special\u offer\u id
),然后删除并插入新记录,或者只是插入一个新的。在您的情况下,
特殊优惠\u id
字段不是唯一的。
// 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.');