2012-07-22 133 views
0

我有3个表:链接,关键字和keywords_links。 keywords_links加入了另外两个表。现在我试图编写一个删除链接的PHP函数。它也将不得不删除将被删除的链接仅使用的所有关键字。我被困在MySQL查询中以删除这些关键字。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' 
) 
+0

'links'表是如何关联的? – 2012-07-22 20:44:38

+0

这就像典型的帖子和标签表。链接有一个id,它通过'keywords_links'表链接到关键字。 – 2012-07-22 20:47:06

回答

0

尝试分离获得的SQL(1台),删除链接,删除该链接的所有keywords_links并删除所有关键字NOT IN(或NOT EXISTS)keywords_links表。

通过这种方式,你可以删除所有仅被这个链接使用的关键字(如果关键字是其他链接中的用户将在关键字链接中并且它不会被删除)。

或者你也可以做两个触发器:在链接中keywords_links

0

相反的INNER JOINon deleteon delete,你需要一个LEFT JOIN和相关表links寻找空值。请首先用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 
相关问题