mysql - mySQL删除重复但保留特定ID
问题描述
我有一个带有id、articleID和categoryID的表。一个 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)
解决方案
为避免 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)
推荐阅读
- python - 我对 ANN 的准确性并不完美
- raspbian - PPPD 连接在启动后几秒钟内停止工作
- spring - 如何启用所有 SpringBoot 执行器端点?
- apache-nifi - 如果选择“执行:主节点”,处理器在 Apache NiFi 中不起作用
- javascript - Javascript 使用索引对对象进行排序
- html - BehavorSubject 的订阅者没有发现 chanfes
- python - 在 Python 中使用预主密钥计算 TLS PRF 主密钥
- java - 需要从从 influx db 获取的数据中分离或仅提取值
- c# - 在不使用 GCHandle.Alloc 的情况下将固定长度的缓冲区作为参数传递给函数
- java - 需要帮助将阴影效果应用于 java 中的 pdf 框组件