0

リンク、キーワード、keywords_links の 3 つのテーブルがあります。keyword_links は、他の 2 つのテーブルを結合します。現在、リンクを削除する 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'
)
4

2 に答える 2

0

SQL を分離し (テーブルの場合は 1)、リンクを削除し、そのリンクのすべての keyword_links を削除し、すべてのキーワードNOT IN(またはNOT EXISTS) keyword_links テーブルを削除してください。

この方法で、このリンクでのみ使用されるすべてのキーワードを削除できます (キーワードが他のリンクのユーザーである場合は、keywords_links にあり、削除されません)。

または、2 つのトリガーを実行することもできます:on deleteリンクon delete内と keyword_links 内

于 2012-07-22T20:48:25.483 に答える
0

の代わりにINNER JOINが必要LEFT JOINで、関連するテーブルで NULL を探しますlinksSELECTの代わりにa を使用して、まずこれをテストしてください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
于 2012-07-22T20:48:26.730 に答える