0

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

table comments
-id
-name

table tags
id
name

table comment_tag
comment_id
tag_id

因此,当一条评论被保存(可能是创建或更新)时,我们会得到一堆需要从 post_tag 表中创建、插入或删除的标签。事实上,有3种可能的情况:

  • comment_tag 已经存在;无需采取任何行动
  • comment_tag 尚不存在;在 comment_tag 表中插入
  • 删除了评论标签;从 comment_tag 表中删除

这样做的最佳/最佳方式是什么?

选项 1:循环遍历每个 POSTed 标签并采用上述 3 条路线之一,具体取决于 comment_tag 状态。

选项2从comment_tag中删除comment_id ='123'的所有记录,然后进行插入?

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

4

1 回答 1

3

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

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;

有关交互式示例,请参见http://sqlfiddle.com/#!2/81f58/1 。

于 2012-10-06T18:26:56.057 回答