MySQL中的tag使用详解mysql中tag的用法

MySQL中使用的是两个表tags和tag_map。tags用于存储标签的名称,tag_map用于存储标签对文章的关联关系。以下是tags表的结构:CREATE TABLE `tags` (`tag_id` int(11) unsigned NOT NULL AUTO_INCREMENT,`tag` varchar(50) NOT NULL DEFAULT ”,PRIMARY KEY (`tag_id`)) ENGINE=InnoDB ...
MySQL中的tag使用详解mysql中tag的用法
MySQL中的tag使用详解
在当前的信息爆炸时代,一些网站需要给内容打上标签,方便用户快速定位和搜索相关内容。MySQL中提供了一些方便的操作可以实现标签的使用。
一、什么是标签(Tag)?
标记(tag)是指由用户添加到某种信息的非正式元数据,以便将来简单地识别。这种识别可能是通过搜索,浏览标记的名称,缩小范围、显示与组织标签的有意群组,等等。
二、MySQL中如何使用标签?
MySQL中使用的是两个表tags和tag_map。tags用于存储标签的名称,tag_map用于存储标签对文章的关联关系。以下是tags表的结构:
CREATE TABLE `tags` (
`tag_id` int(11) unsigned NOT NULL AUTO_INCREMENT,
`tag` varchar(50) NOT NULL DEFAULT ”,
PRIMARY KEY (`tag_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
以下是tag_map表的结构:
CREATE TABLE `tag_map` (
`tag_id` int(11) unsigned NOT NULL,
`post_id` int(11) unsigned NOT NULL,
PRIMARY KEY (`tag_id`,`post_id`),
KEY `post_id` (`post_id`),
CONSTRNT `tag_map_ibfk_1` FOREIGN KEY (`tag_id`) REFERENCES `tags` (`tag_id`) ON DELETE CASCADE ON UPDATE CASCADE
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
tag_map表中tag_id和post_id是tag和文章(Post)的关联关系。tag_id来自tags表的tag_id字段。以上建表SQL语句只是示意,可以根据需要进行其他的限制和优化。
三、如何增加标签给文章?
在文章表中加入以下代码:

— Table structure for table `posts`

CREATE TABLE IF NOT EXISTS `posts` (
`id` int(11) unsigned NOT NULL AUTO_INCREMENT,
`title` varchar(200) NOT NULL DEFAULT ”,
`content` text NOT NULL,
`published` tinyint(1) NOT NULL DEFAULT ‘0’,
`created` datetime NOT NULL,
`modified` datetime NOT NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
然后在文章表中增加一个关联关系函数add_tag。函数的参数是文章ID和标签名,函数实现在tag_map表中加入一条关联关系。以下是增加标签的函数代码:
DELIMITER //
CREATE FUNCTION `add_tag`(in_tag varchar(50), in_post_id int(11)) RETURNS int(11)
BEGIN
DECLARE tag_id int(11);
SELECT tag_id INTO tag_id FROM tags WHERE tag=in_tag LIMIT 1;
IF (tag_id IS NULL) THEN
INSERT INTO tags(tag) VALUES (in_tag);
SET tag_id=LAST_INSERT_ID();
END IF;
INSERT INTO tag_map(tag_id,post_id) VALUES (tag_id,in_post_id);
RETURN tag_id;
END//
DELIMITER ;
四、如何查找文章的标签?
在文章表中增加一个函数get_tags。函数的参数是文章ID,函数查询可以到标签的名称。函数返回一个标签名的数组。以下是查询标签名的函数代码:
DELIMITER //
CREATE FUNCTION `get_tags`(in_post_id int(11)) RETURNS VARCHAR(255)
BEGIN
DECLARE tag_list VARCHAR(255);
DECLARE done INT DEFAULT FALSE;
DECLARE cur_tag CURSOR FOR SELECT tags.tag FROM tags, tag_map WHERE tag_map.post_id=in_post_id AND tag_map.tag_id=tags.tag_id;
DECLARE CONTINUE HANDLER FOR NOT FOUND SET done = TRUE;
OPEN cur_tag;
tag_loop: LOOP
FETCH cur_tag INTO tag_list;
IF done THEN
LEAVE tag_loop;
END IF;
IF tag_list IS NOT NULL THEN
SET tag_list=CONCAT(tag_list, ‘,’);
END IF;
SET tag_list=CONCAT(tag_list,’%[‘,tag_list,’]%’);
END LOOP tag_loop;
CLOSE cur_tag;
RETURN tag_list;
END//
DELIMITER ;
五、如何搜索标签?
增加一个函数get_posts_by_tag。函数的参数是标签名,函数以搜索的方式返回所有含有此标签的文章。以下是搜索标签的函数代码:
DELIMITER //
CREATE FUNCTION `get_posts_by_tag`(in_tag varchar(50)) RETURNS varchar(750)
BEGIN
DECLARE post_list varchar(750);
DECLARE done INT DEFAULT FALSE;
DECLARE cur_post CURSOR FOR SELECT posts.title FROM posts, tag_map, tags WHERE tags.tag LIKE CONCAT(‘%[‘,in_tag,’]%’) AND tags.tag_id=tag_map.tag_id AND posts.id=tag_map.post_id;
DECLARE CONTINUE HANDLER FOR NOT FOUND SET done = TRUE;
OPEN cur_post;
post_loop: LOOP
FETCH cur_post INTO post_list;
IF done THEN
LEAVE post_loop;
END IF;
IF post_list IS NOT NULL THEN
SET post_list=CONCAT(post_list, ‘;’);
END IF;
SET post_list=CONCAT(post_list,post_list);
END LOOP post_loop;
CLOSE cur_post;
RETURN post_list;
END//
DELIMITER ;
以上函数只是示意,你需要进行特定情况的调整和优化,以达到最佳的实际效果。
MySQL通过tag实现了文本分类管理,为网站内容提供了更方便的搜索和标签化功能。如果您还有不懂的地方,欢迎访问MySQL官方文档进行学习。2024-08-13
mengvlog 阅读 33 次 更新于 2025-09-09 23:48:37 我来答关注问题0
  • 然后在文章表中增加一个关联关系函数add_tag。函数的参数是文章ID和标签名,函数实现在tag_map表中加入一条关联关系。以下是增加标签的函数代码:DELIMITER // CREATE FUNCTION `add_tag`(in_tag varchar(50), in_post_id int(11)) RETURNS int(11)BEGIN DECLARE tag_id int(11);SELECT tag_id...

  •  文暄生活科普 MySQL列分割成多行的方法

    1. 首先计算每个用户的标签个数。利用length()和replace()方法获取标签个数。公式为((length(tag) - length(replace(tag,',',''))) + 1)。这样,可以得到每个用户所拥有的标签数量。2. 之后,使用MySQL自带的`help_topic`表中的`help_topic_id`序列按照tag的个数进行联结。通过`help_topic_id...

  •  阿暄生活 SQL如何按逗号拆分字符串

    CREATE TEMPORARY TABLE temp_tags AS SELECT id, SUBSTRING_INDEX(tags, ',', 1) AS tag FROM temp_tags WHERE tag IS NOT NULL;最后,将拆分后的标签插入目标表:INSERT INTO target_table (id, tag) SELECT id, tag FROM temp_tags;这种方法利用了MySQL中的SUBSTRING_INDEX函数,可以有效地将...

  • 1.MySQL的SQL语句里面是可以加注释的。例如:"select * from t1"可以写成"/* tag */select * from t1"。这个tag可以扩展成很多格式,这样在MySQL的日志中就可以看到这个tag。2."!"后的5位数字代表MySQL版本号,上面这个语句的意思是只有MySQL版本号大于9.0的时候,注释内容才会被执行。由于目前也...

  •  云易网络科技 MySQL实现一列多值存储方法mysql一列多值

    INSERT INTO `user_tag` VALUES (2,2);INSERT INTO `user_tag` VALUES (2,3);INSERT INTO `user_tag` VALUES (2,4);该方法的优点在于,可更好地使用数据库索引,查询效率高;缺点在于,数据表设计复杂,需要额外维护关联表。通过上述介绍,可以看到,MySQL实现一列多值存储的方法有多种选择,...

檬味博客在线解答立即免费咨询

mySQL相关话题

Copyright © 2023 WWW.MENGVLOG.COM - 檬味博客
返回顶部