使用引用原始表的子查询删除

时间:2013-12-07 00:21:58

标签: mysql sql subquery sql-delete

我正在处理以下查询,该查询根据引用同一个表的子查询从我的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

我不确定如何修复此问题,以便查询成功运行此删除。有谁知道如何进行这种类型的删除,即在子查询中引用父表并同时使用相同的表?

1 个答案:

答案 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%'
如果我正确理解您的架构,

应该可以解决问题