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官方文档进行学习。