简体   繁体   English

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

[英]MySQL: Deleting rows that don't have a match in another table

I have 3 tables: links, keywords, and keywords_links. 我有3个表格:链接,关键字和keyword_links。 keywords_links joins the two other tables. keyword_links连接其他两个表。 Right now I'm trying to write a PHP function that deletes a link. 现在,我正在尝试编写一个删除链接的PHP函数。 It would also have to delete all the keywords that are only used by the link that will be deleted. 它还将必须删除仅将由要删除的链接使用的所有关键字。 I'm stuck at the MySQL query to delete those keywords. 我被困在MySQL查询中以删除那些关键字。

Here's what I have right now: 这是我现在所拥有的:

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

Edit: This seems to be working, is there a more efficient way? 编辑:这似乎正在工作,有没有更有效的方法? (with no subqueries?) (没有子查询?)

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'
)

Try to separate the sqls (1 for table), delete the link, delete all the keywords_links of that link and delete all keywords NOT IN (or NOT EXISTS ) keywords_links table. 尝试分隔sqls(表为1),删除链接,删除该链接的所有keyword_links并删除所有关键字NOT IN (或NOT EXISTS )的keyword_links表。

In that way you can delete all keywords which are only used by this link (if a keyword is user in other link will be in keywords_links and it don't be deleted). 这样,您可以删除该链接仅使用的所有关键字(如果其他链接中的用户是关键字,它将在keyword_links中并且不会被删除)。

Or you can do two Triggers: on delete in links and on delete in keywords_links 或者你也可以做两个触发器: on delete的链接,并on delete中keywords_links

Instead of an INNER JOIN , you need a LEFT JOIN and look for NULLs in the related table links . 您需要使用LEFT JOIN并在相关的表links查找NULL,而不是INNER JOIN Please test this first with a SELECT instead of DELETE FROM . 请首先使用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

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM