Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/shell/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 在数据库模式中实现标记_Php_Mysql_Tags - Fatal编程技术网

Php 在数据库模式中实现标记

Php 在数据库模式中实现标记,php,mysql,tags,Php,Mysql,Tags,我正在现有应用程序中实现标记方案。为了简单起见,我们可以假设使用以下表结构 table comments -id -name table tags id name table comment_tag comment_id tag_id 因此,当一条注释被保存(可以是create或update)时,我们会从post_标记表中得到一堆需要创建、插入或删除的标记。事实上,有3种可能的情况: 注释标签已经存在;不需要采取行动 注释标签尚不存在;在注释标记表中插入 删除注释标签;从注释标记表中删除

我正在现有应用程序中实现标记方案。为了简单起见,我们可以假设使用以下表结构

table comments
-id
-name

table tags
id
name

table comment_tag
comment_id
tag_id
因此,当一条注释被保存(可以是create或update)时,我们会从post_标记表中得到一堆需要创建、插入或删除的标记。事实上,有3种可能的情况:

  • 注释标签已经存在;不需要采取行动
  • 注释标签尚不存在;在注释标记表中插入
  • 删除注释标签;从注释标记表中删除
这样做的最佳方式是什么

选项1:根据注释标记状态,循环浏览每个已发布的标记,并选择上述3条路线中的一条

选项2从comment_id='123'的comment_标记中删除所有记录,然后执行插入


这些似乎都不是最理想的。我希望有一个更好的选择。

这应该是最佳的,并显示了如何插入其他字段或更新这些字段:

START TRANSACTION;

INSERT INTO comments (name,created) VALUES ('comment', NOW())
ON DUPLICATE KEY UPDATE updates = updates + 1;

INSERT INTO tags (name,created) VALUES
('tag1', NOW()),
('tag2', NOW()),
('tag3', NOW())
ON DUPLICATE KEY UPDATE updates = updates + 1;

DELETE
comment_tag
FROM
comment_tag
INNER JOIN
comments c ON c.id = comment_tag.comment_id
LEFT JOIN
tags t ON t.id = comment_tag.tag_id
WHERE
c.name = 'comment' AND
t.name NOT IN ('tag1','tag2','tag3');

INSERT INTO comment_tag (comment_id, tag_id ,created) 
SELECT
c.id AS comment_id,
t.id AS tag_id,
NOW() AS created
FROM
comments c,
tags t
WHERE
c.name = 'comment' AND
t.name IN ('tag1','tag2','tag3')
ON DUPLICATE KEY UPDATE comment_tag.updates = comment_tag.updates + 1;

COMMIT;

有关交互式示例,请参见。

这将以最佳方式执行,并显示如何插入或更新其他字段:

START TRANSACTION;

INSERT INTO comments (name,created) VALUES ('comment', NOW())
ON DUPLICATE KEY UPDATE updates = updates + 1;

INSERT INTO tags (name,created) VALUES
('tag1', NOW()),
('tag2', NOW()),
('tag3', NOW())
ON DUPLICATE KEY UPDATE updates = updates + 1;

DELETE
comment_tag
FROM
comment_tag
INNER JOIN
comments c ON c.id = comment_tag.comment_id
LEFT JOIN
tags t ON t.id = comment_tag.tag_id
WHERE
c.name = 'comment' AND
t.name NOT IN ('tag1','tag2','tag3');

INSERT INTO comment_tag (comment_id, tag_id ,created) 
SELECT
c.id AS comment_id,
t.id AS tag_id,
NOW() AS created
FROM
comments c,
tags t
WHERE
c.name = 'comment' AND
t.name IN ('tag1','tag2','tag3')
ON DUPLICATE KEY UPDATE comment_tag.updates = comment_tag.updates + 1;

COMMIT;

有关交互式示例,请参见。

这只是两个选项。实现这两种方法,然后告诉我们你的经验(我也可以说:在电脑关机的情况下,给自己倒杯茶,呼吸一小时新鲜空气)。你很可能也会有真正的解决方案。好吧,这只是两个选择。实现这两种方法,然后告诉我们你的经验(我也可以说:在电脑关机的情况下,给自己倒杯茶,呼吸一小时新鲜空气)。你很可能也会有真正的解决方案。所以,基本上,选择2。删除该评论的所有标签,然后重新插入?事实上,我更新了答案,只在标签被删除时才删除。因此,基本上是选项2。删除该评论的所有标签,然后重新插入?事实上,我更新了答案,仅当标签被删除时才删除。