【问题标题】:Making a tag cloud with MySQL and PHP使用 MySQL 和 PHP 制作标签云
【发布时间】:2011-02-15 23:37:44
【问题描述】:

我正在制作标签云。我有一个名为标签的表,其中包含行“id”和行“标签”。

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

每一行 'id' 将是被标记的网页的 id - 在本例中为 'foo'。

所以任意行可能看起来像:

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 中添加我想要的内容。我该怎么做?

【问题讨论】:

    标签: php sql mysql tags


    【解决方案1】:

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

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

    【讨论】:

      【解决方案2】:

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

      检索给定标签的页面:

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

      添加一个新的:

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

      删除网页:

      DELETE FROM tags WHERE id = webpageID;
      

      【讨论】:

      • 请注意,您应该在两个字段上放置单独的索引,以及两个字段上的 PK。
      【解决方案3】:

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

      所以你的结果会是:1,“第一个标签”,1,“第二个标签”,1,“另一个标签”。如果您使用 INSERT IGNORE 它会默默地忽略欺骗。因此,每个站点 ID 的每个标记对应一行。

      【讨论】:

        【解决方案4】:

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

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

        一个例子可能是带有标签“foo”和“bar”的文章“abc”。

        内容将有一行具有 ContentID(例如 1)和内容 (abc)。 标签将有两行:每行都有一个 TagID(分别为 1、2)和一个 TagText(foo,bar) ContentTags 也有两行,分别是 ContentTagID (1, 2)、ContentID (1, 1) 和 TagID (1, 2)。

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

        要插入一个新标签,您可以将它添加到标签表中,然后在 ContentTags 中添加一个条目,将您刚刚添加的标签链接到您刚刚添加的文章。

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

        希望对你有所帮助,

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2010-12-31
          • 1970-01-01
          • 2016-01-10
          • 2010-09-15
          • 2017-10-05
          相关资源
          最近更新 更多