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が削除されました。comment_tagテーブルから削除します

これを行うための最良/最適な方法は何ですか?

オプション1:postedタグのそれぞれをループし、comment_tagのステータスに応じて、上記の3つのルートのいずれかを使用します。

オプション2comment_id= '123'であるcomment_tagからすべてのレコードを削除してから、挿入を実行しますか?

これらのどれも本当に最適ではないようです。より良い選択肢があることを願っています。

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 に答える