如果重复键存在于具有指定值

时间:2016-07-19 14:45:14

标签: mysql sql-delete exists

这可能被标记为重复,但我无法在搜索中找到此示例。

我有一个产品到类别表,允许重复键,因此允许按ID分类产品。我有一种情况,数千种产品被错误地放在一个类别中。如果产品被分配到“动作人物”和“漫画”,则“漫画”分配是错误的。

我正在尝试编写单个MYSQL查询,如果检测到具有重复键和“Action Figures”的指定值的行,则该查询将删除行。另一种说法:如果产品被分配到两个类别,那么我想删除将其分配给错误类别的行。

我似乎无法找出一个删除语句,可以按照我想要的方式在ID中搜索同一个表。

这是我到目前为止所做的事情(编辑 - 感谢下面的答案):

DELETE FROM oc_product_to_category c1
WHERE c1.category_id = '25'
AND EXISTS(
SELECT * FROM oc_product_to_category c2 
WHERE c1.product_id = c2.product_id AND c2.category_id = '24')

不幸的是,这产生了语法错误。

You have an error in your SQL syntax; 
check the manual that corresponds to your MySQL server version for the right syntax to use near 
'c1
WHERE c1.category_id = '25'
AND EXISTS (
SELECT * FROM oc_product_to_catego' at line 1

当我尝试语法

DELETE c1 FROM oc_product_to_category c1 ...

我收到错误:

You can't specify target table 'c1' for update in FROM clause

1 个答案:

答案 0 :(得分:0)

这应该让你开始。如果为category_id 25和33分配了ID,它将删除类别为25的记录。

DELETE c1 FROM oc_product_to_category as c1
WHERE c1.category_id = '25'
AND EXISTS (
    SELECT id FROM (SELECT * FROM oc_product_to_category) as c2 
    WHERE c1.id = c2.id AND c2.category_id = '33'
)

请注意,如果存在category_id 33,则不会删除重复记录。