我正在现有应用程序中实现标记方案。为简单起见,我们可以假设使用了下表结构
table comments
-id
-name
table tags
id
name
table comment_tag
comment_id
tag_id
因此,当保存注释(可能是创建或更新)时,我们会得到一堆需要在post_tag表中创建,插入或删除的标记。事实上,有三种可能的情况:
这样做的最佳/最佳方式是什么?
选项1:根据comment_tag状态,遍历每个POSTed标记并采用上述3条路线之一。
选项2删除comment_tag中的所有记录,其中comment_id ='123',然后执行插入操作?
这些似乎都不是最佳选择。我希望有更好的选择。
答案 0 :(得分: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。