我正在处理以下查询,该查询基于引用同一表的子查询从我的 tags_users
表中删除。此外,还引用父表中的字段。如果用户具有某种类型的标签,即 job
,那么他们的 test-alert
标签必须消失。我认为这不会作为联接起作用,因为tags_users表是标准的HABTM关系表,因此每一行都引用一个关系,并且无法根据联接知道用户可能拥有哪些其他标签。这是查询:
DELETE tag_user_alias
FROM tags_users tag_user_alias
WHERE
tag_user_alias.tag_id = 1118
AND EXISTS (
SELECT
inner_tags_users.user_id
FROM
tags_users AS inner_tags_users, tags
WHERE
inner_tags_users.tag_id = tags.id AND
inner_tags_users.user_id = tag_user_alias.user_id AND
tags.tag_slug <> 'test-alert' AND
tags.tag_slug LIKE 'job%'
);
我试图通过别名使此查询工作,但我不断遇到以下错误:
#1093 - You can't specify target table 'tag_user_alias' for update in FROM clause
我不确定如何解决此问题,以便查询成功操作此删除。有谁知道如何执行这种类型的删除,即在子查询中引用父表并为两者使用相同的表?
最佳答案
首先:您不能在子查询中使用正在 super 查询中写入(即插入、更新或删除)的表。
也就是说,您应该尝试DELETE FROM JOIN
:
DELETE
tags_users_ta.*
FROM
tags_users AS tags_users_ta
INNER JOIN tags AS tags_ta ON tags_users_ta.tag_id=tags_ta.id
INNER JOIN tags_users AS tags_users_job ON tags_users_ta.user_id=tags_users_jon.user_id
INNER JOIN tags AS tags_job ON tags_users_job.tag_id=tags_job.id
WHERE
tags_ta.tag_slug = 'test-alert' AND
tags_job.tag_slug LIKE 'job%'
如果我正确理解你的架构,应该可以解决问题
关于mysql - 使用引用原始表的子查询删除,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20435909/