var/columnsと入力フォームが次のようになっていると仮定します。
$tag_ids = $_POST['tags']; // all article tags
$article_id = (int)$_POST['article_id'];
必要なチェックユーザー入力を行うと、削除された古いタグを削除できます。
// delete unused tag_id for article
$db->query('DELETE FROM articles_to_tags
WHERE tag_id NOT IN ('.$db->quote($tag_ids).')
AND article_id = ?',Array($article_id));
ステートメントを持つ一意のキーとして、 新しいタグ(および新しいタグのみ)を追加できるarticle_id
と仮定します。tag_id
insert ignore
// insert new tag and ignore old
$qry = 'INSERT IGNORE INTO articles_to_tags (article_id,tag_id)';
$qry_values = Array();
foreach($tag_ids as $tag_id) {
qry_values[] = "VALUES ($article_id,$tag_id)";
}
$qry .= implode(", ",$qry_values);
$db->query($qry);
最後に、cronスクリプトを使用して、古いタグを削除できます。
$db->query('DELETE FROM tags
WHERE tag_id NOT IN (SELECT DISTINCT tag_id FROM articles_to_tags)');
または、記事の更新ごとに行うことができます。それほど重くないと思います。