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


数据运维技术 » MySQL中的tag使用详解(mysql中tag的用法)