gpt4 book ai didi

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

转载 作者:可可西里 更新时间:2023-11-01 07:37:22 27 4
gpt4 key购买 nike

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

我注意到的不幸是,当删除一个帖子时,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 中创建帖子行:

mysql create post

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

mysql associative entity

在 Tag_T 中创建标签行:

mysql create tag

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

mysql php manage posts

最佳答案

当您由于 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 演示

关于php - MySQL Delete Row 在需要时不删除多对多表中的值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18503583/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com