【问题标题】:delete query from a table which have relation with others table从与其他表有关系的表中删除查询
【发布时间】:2019-06-09 10:50:40
【问题描述】:

我有两个这样的表: tbl1-

ID | post_id | terms_id
------------------------
1     4001      2
2     4001      1
3     4001      3
4     4002      5
5     4002      2

tbl2-

terms_id | taxonomy_id | taxonomy
----------------------------------
1          30             category
2          33             keywords
3          42             location
4          52             category
5          32             category

我想要两个从 tbl2 中删除 tbl1,其中 post_id = 4001 和 (terms_id = 'category')。 我无法编写此查询如何设置关系 tbl1 terms_id 和 tbl2 terms_id 并且 tbl2 terms_id 应该是“类别”。 我尝试使用内部联接,但它删除了两个表数据或显示错误。我只需要从 tbl1 数据中删除。
这是我的查询:

DELETE FROM tbl1 
INNER JOIN tbl2 ON tbl2.terms_id = tbl1.terms_id 
WHERE tbl2.taxonomy = 'category' AND tbl1.post_id = 4001

【问题讨论】:

  • Delete with Join in MySQL的可能重复
  • 向我们展示您当时尝试过的查询。如果您的连接查询删除过多,则其中一定有错误。
  • 从 tbl1 中删除 INNER JOIN tbl2 ON tbl2.terms_id = tbl1.terms_id WHERE tbl2.taxonomy = 'category' AND tbl1.post_id = 4001
  • 你很亲密,换成DELETE tbl1 FROM tbl1 INNER JOIN ....

标签: mysql sql


【解决方案1】:

删除涉及的表在DELETE子句中声明,所以你应该声明你需要删除行的表名

这应该仅根据连接表的匹配结果从 tbl1 中删除

DELETE tbl1
FROM tbl1
INNER JOIN tbl2 ON tbl1.post_id  = 4001 
  and tbl1.terms_id  = tbl2.terms_id 
    and  tbl2.taxonomy = 'category' 

【讨论】:

  • 这个和副本很相似。
  • 谢谢你的兄弟,我明白了......以及它的工作。非常感谢
  • @scaisEdge 出于好奇,您为什么将过滤谓词放在JOIN 子句而不是WHERE 子句中?这是一个内部连接,所以它不应该有任何区别。
  • @TheImpaler 正如我通常所做的那样,我倾向于将子句作为连接的显式元素包含在内,这对我来说更清晰,并且我可以更好地组织相关元素。但在这种情况下,谓词在我看来是连接的一个组成部分
猜你喜欢
  • 2013-04-26
  • 1970-01-01
  • 2021-06-13
  • 2021-02-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多