使用MySQL和PHP制作标签云

时间:2011-02-15 23:37:44

标签: php sql mysql tags

我正在做一个标签云。我有一个名为tag的表,其中行'id'和行'tag'。

每一行'标签'都是一个标签,就像在这个网站上一样 - 想象一个名为'foo'的标签就是这个例子。

在这个例子中,每行'id'将是标记为'foo'的网页的id。

所以任何仲裁行都可能如下:

foo | 3 6 16 39 43 58 38 12 55

如何创建一个函数来检查整个表是否存在$ tag,如果存在,则为该标记的行'id'添加一个空格和$ id。如果我的表中不存在该标记,则添加标记,然后添加id。

我的代码(半PHP,半伪)如下:

if($tag doesnt exist in table)
{
     mysql_query("INSERT INTO tags (tag, id) VALUES ('$tag', '$id'");
}
if($tag exists in table)
{
     mysql_query("...append somehow... $id . " " WHERE tag = '$tag'");
}

我只是不知道在条件中放什么或者如何在SQL中追加我想要的内容。我怎么能这样做?

4 个答案:

答案 0 :(得分:1)

有更好的方法来实现此功能。通常,为了实现标记系统,您将拥有两个表,tags和item_tags(或在您的系统中有意义的其他名称。)tags表将包含标记id和标记名称,而item_tags表将包含标记id和item_it(你标记的id的任何项目)。每个项目每个标签将有1行。因此,如果一个项目有3个标签,则item_tags表格中将有3行。这将简化您的应用程序,并可能减少数据库服务器上的负载。

但是,如果您需要按照当前的方式进行操作,则需要先为每个请求选择当前项目的标记。如果结果集中没有任何行,则创建一个新行。否则,您从返回的行中获取值,连接新标记ID,然后执行更新。此方法将导致每个请求至少进行两次数据库调用,而不是像我上面提出的解决方案那样。

HTH

答案 1 :(得分:0)

为什么在tags表中只有多行?每个网页都有一个标签?

检索给定标记的页面:

SELECT id FROM tags WHERE tag = `my-tag`;

添加新的:

INSERT INTO tags (tag, id) VALUES ('my-tag', newWebpageID);

删除网页:

DELETE FROM tags WHERE id = webpageID;

答案 2 :(得分:0)

您需要三个表来实现这一目标(即没有重复数据或滥用字段):

内容(人们写的有标签的东西) 标签(标签列表) ContentTags(应用于内容的标签列表)

示例可能是文章“abc”,标签为“foo”和“bar”。

内容的行包含ContentID(例如1)和Content(abc)。 标签有两行:每行都有一个TagID(分别为1,2)和一个TagText(foo,bar) ContentTags还有两行,包含ContentTagID(1,2),ContentID(1,1)和TagID(1,2)。

通过这种方式,您可以拥有大量不同的标签(存储在Tags表中)并将它们链接到文章(包含ContentTags中的条目)。

要插入新标记,您需要将其添加到“标记”表格中,然后在ContentTags中添加一个条目,将您刚刚添加的标记链接到刚刚添加的文章中。

要检查新文章是否存在标记,请对标记运行查询(例如“SELECT TagID FROM Tags WHERE TagText = $ tagText”)。如果您得到结果,则标签存在,您只需要使用刚刚检索到的TagID和刚刚添加的文章的ArticleID在ContentTags中添加一个条目。

希望这有一些帮助,

答案 3 :(得分:0)

使用一个表,您可以使用复合主键或使用ID和标记创建唯一索引。

所以你的结果将是:1,“first tag”,1,“second tag”,1,“another tag”。如果您使用INSERT IGNORE,它将默默地忽略欺骗。因此,每个站点ID的每个标记都有一行。