4

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

我注意到的不幸之处是,删除 Post 时,Tag_T 中的标记行仍然存在,而 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 行:

mysql 创建帖子

PostTag_T中post和tag的映射:

mysql关联实体

在 Tag_T 中创建标记行:

mysql 创建标签

删除时:将 AJAX POST 与调用 url 中的 php 文件的数据一起使用(猜测这是我可能需要添加搜索表的查询的地方..)

mysql php 管理帖子

4

2 回答 2

1

当您删除帖子时,由于表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演示

于 2013-08-29T06:59:26.197 回答
1
DELETE FROM `tag_t` WHERE 
`tID` IN (SELECT `tID` FROM `posttag_t` WHERE `pID` = 'post_id') AND 
`tID` NOT IN (SELECT `tID` FROM `posttag_t` WHERE `pID` != 'post_id')

上述查询检查的最后一部分是否有任何使用此标签的帖子。

于 2013-08-29T06:31:15.060 回答