php – MySQL Delete Row在需要时不删除多对多表中的值

我正在实现自己的博客系统,以更好地理解
PHP,mySQL和jQuery AJAX的面向对象方面.我在Post_T和Tag_T之间有多对多的关系,因此包括一个关联实体PostTag_T.在创建帖子时,我添加了一些函数来检查标签是否已经存在,并添加新标签和映射,或者只是将映射添加到现有标签.

我注意到的不幸是当删除Post时,TagT中的标记行仍然存在,而PostTag_T中的映射被删除(设置为ON DELETE CASCADE).如果标签没有被任何其他帖子使用,我该如何删除?删除帖子时我有帖子ID.

有用的逻辑
使用删除的帖子ID,从tag_t删除posttag_t中的pID =帖子ID并且posttag_t中没有其他帖子(pID)使用相同的标签ID.

delete from tag_t where tID = (select tID from posttag_t where pID='post id') AND..

为了您的理智,这里是一个视觉表现

在Post_T中创建了Post行:

PostTag_T中帖子和标签之间的映射:

Tag_T中创建的标记行:

删除时:使用AJAX POST和在url中调用php文件的数据(猜测这是我可能需要添加查询表的查询…)

最佳答案 当您删除由于ON DELETE CASCADE而发布的帖子时,posttag_t表中不再有行,因此尝试匹配它是没用的.这意味着您只剩下选项删除所有与任何帖子无关的标签.

您可以使用查询执行此操作

DELETE t
  FROM tag_t t
 WHERE NOT EXISTS
(
  SELECT *
    FROM posttag_t 
   WHERE tid = t.tid
);

这是SQLFiddle演示

现在你可以让一个触发器来处理它

CREATE TRIGGER gt_ad_posttag_t
AFTER DELETE ON post_t
FOR EACH ROW
  DELETE t
    FROM tag_t t
   WHERE NOT EXISTS
  (
    SELECT *
      FROM posttag_t 
     WHERE tid = t.tid
  );

这是SQLFiddle演示

点赞