MySQL:删除另一个表中没有匹配的行

时间:2012-07-22 20:38:39

标签: php mysql

我有3个表:链接,关键字和keywords_links。 keywords_links加入另外两个表。现在我正在尝试编写删除链接的PHP函数。它还必须删除仅被将被删除的链接使用的所有关键字。我坚持在MySQL查询中删除这些关键字。

这就是我现在所拥有的:

DELETE FROM keywords INNER JOIN keywords_links ON keywords_links.keyword_id=keywords.id WHERE keywords_links.link_id='123' AND NOT EXISTS(...?)

编辑:这似乎有效,是否有更有效的方法? (没有子查询?)

DELETE
FROM keywords
INNER JOIN keywords_links ON keywords_links.keyword_id = keywords.id
WHERE keywords_links.link_id = '123'
AND ! 
EXISTS (
  SELECT * 
  FROM keywords_links
  WHERE keyword_id = keywords.id
  AND link_id != '123'
)

2 个答案:

答案 0 :(得分:0)

尝试分隔sqls(表格为1),删除链接,删除该链接的所有keywords_links并删除所有关键字NOT IN(或NOT EXISTS)keywords_links表。

通过这种方式,您可以删除仅由此链接使用的所有关键字(如果关键字是其他链接中的用户将位于keywords_links中且不会被删除)。

或者您可以在链接中执行两个触发器:on delete,在keywords_links中使用on delete

答案 1 :(得分:0)

而不是INNER JOIN,您需要LEFT JOIN并在相关表links中查找NULL。请先使用SELECT代替DELETE FROM进行测试。

DELETE FROM
  keywords
  LEFT JOIN keywords_links ON keywords.id = keywords_links.keyword_id
  LEFT JOIN links ON keywords_links.link_id = links.id
WHERE 
  keywords_links.link_id=123
  AND links.id IS NULL