mysql - 更新 MySQL 中的标签映射表

标签 mysql tags tagging

我有一个 MySQL 标记映射表,其结构来自以下帖子 - Recommended SQL database design for tags or tagging

我有两列 - TagID 和 ItemID。我想对某些项目进行更新(更改其标签)。例如,我有 ID=1 且标签 ID 为 1、2、3 的项目。但是在更新时,用户只需要 ID 为 3、4、5 的标签。显然我必须删除“1”和“2”,保留“3”并添加“4”和“5”。

什么是最简单/最优雅的方法(使用 INSERT INGORE'S、ON DUPLICATE UPDATE 或 MySQL 的其他一些“功能”)?

全部删除并插入所有"new"标签,还是遍历所有标签并单独删除/插入?这将是最少 1 个,最多 5 个标签。或者对于这么少的标签/操作真的无关紧要?

最佳答案

如果你肯定有最多五个标签,在表中包括它们作为tag1、tag2、tag3、tag4,tag5肯定是“最简单的”。为了更加简单,您可以只更新所有 5 个值,因此标签 3、4、5 保存到 tag1、tag2、tag3,而 tag4 和 tag5 保存为 NULL。显然它是不可扩展的——您肯定不希望使用大量(或可能无限)标签来做到这一点。

下一个最简单的方法是全部删除并重新插入,但这并不是特别优雅。

我能想到的最优雅的方式是运行两个查询。第一个将删除不是您的新标签集的所有内容。我扩展了您的示例以显示添加两个替换标签:(3,4,5,6,7)。 接下来将插入所有新标签,但会根据 TagID 和 ItemID 的 UNIQUE 组合索引忽略重复项。

#This creates the table and UNIQUE index, so you can understand how the next queries work
CREATE TABLE `taglinks` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `ItemID` int(11) NOT NULL,
  `TagID` int(11) NOT NULL,
  PRIMARY KEY (`id`),
  UNIQUE KEY `Linkindex` (`ItemID`,`TagID`)
);

#This inserts example data
INSERT INTO `taglinks` (`ItemID`, `TagID`) VALUES (1,1),(1,2),(1,3),(1,4),(1,5);

#This removes tags 1 and 2
DELETE FROM `taglinks` WHERE `ItemID` = 1 AND `TagID` NOT IN (3,4,5,6,7);

#This adds two new tags (6 and 7). Tags 3, 4 and 5 are unaffected
INSERT IGNORE INTO `taglinks` (`ItemID`, `TagID`) VALUES (1,6),(1,7),(1,3),(1,4),(1,5);

关于mysql - 更新 MySQL 中的标签映射表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9384974/

相关文章:

php - MySQL "Not IN"查询突然停止返回结果

php - 如何根据分隔键将文本插入数据库

html - 链接到网页的特定部分

iPhone:如何像 iPhone 的 Facebook 应用程序一样在照片上标记人物?

database - 如何设置有关共享项目的组织特定数据元素?

MySQL - 我如何写这个查询

java - JPQL 查询 - 实体包含多头列表

git - 你如何恢复到 Git 中的特定标签?

parsing - 术语提取: Generatings tags out of text

django-tagging 或 django-taggit,还是别的什么?