我正在处理以下查询,该查询根据引用同一个表的子查询从我的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
我不确定如何修复此问题,以便查询成功运行此删除。有谁知道如何进行这种类型的删除,即在子查询中引用父表并同时使用相同的表?
答案 0 :(得分:3)
首先:您不能在子查询中使用表,即在超查询中编写(即插入,更新或删除)。
那就是说,你应该试试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%'
如果我正确理解您的架构,应该可以解决问题