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

标签 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

我不确定如何解决此问题,以便查询成功操作此删除。有谁知道如何执行这种类型的删除,即在子查询中引用父表并为两者使用相同的表?

最佳答案

首先:您不能在子查询中使用正在 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/

相关文章:

sql - 如果在稍后在事务中不使用的 CTE 内执行,为什么 SELECT...FOR UPDATE 不起作用?

c# - 删除表中的特定条目

Mysql 子查询在实时服务器上运行缓慢,但在本地运行速度很快

mysql - MySQL 是否支持部分索引?

mysql - MySQL中每个单词(utf8)的大写首字母

mysql - MySQL创建索引时索引名的意义是什么?

mysql - 查找 ('first' )、查找 ('count' ) 或字段 ('id' )...哪个更快?

sql - 如何编写 SQL 查询来生成报告

mysql - Rails 子查询连接

php - 在 mysql 查询中运行 mysql 查询