首页 > 解决方案 > mySQL删除重复但保留特定ID

问题描述

我有一个带有idarticleIDcategoryID的表。一个 articleID 可以有多个 categoryID。

现在我想删除categoryID = 3049的每个条目,如果还有另一个条目与categoryID相同的articleID

所以我做了这个查询,但它给了我错误:

#1093 - 表 's_articles_categories' 被指定了两次,既作为 'DELETE' 的目标,又作为数据的单独源

   DELETE FROM s_articles_categories
    WHERE categoryID = 3049 AND articleID IN
        (
        SELECT articleID
        FROM s_articles_categories
        WHERE articleID IN
            (
            SELECT articleID
            FROM s_articles_categories
            GROUP BY articleID
            HAVING count(articleID) > 1
            )
        AND categoryID != 3049
        )

如何更改此查询?

我也试过这个,但它给了我同样的错误

DELETE FROM s_articles_categories as t1
WHERE id in (SELECT t1.id FROM `s_articles_categories` as t1
JOIN `s_articles_categories` AS t2 on t1.articleID = t2.articleID
WHERE t1.categoryID = 3049 and t2.categoryID != 3049)

标签: mysql

解决方案


为避免 DELETE 出现“指定两次”错误,请将您的内部查询包装在一个额外的“匿名”内部查询中(此处命名为 x):

DELETE t.* 
FROM   `s_articles_categories` t
WHERE  `categoryID` = 3049 
  AND  `articleID` IN (
    SELECT `articleID`
    FROM (
      SELECT `articleID` 
      FROM   `s_articles_categories` 
      WHERE  `categoryID` != 3049)
    x) 

推荐阅读