在阅读问题之前检查此示例 - 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个查询?
答案 0 :(得分: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.');