获取所有相关标签?

时间:2009-12-04 02:39:20

标签: php loops

这非常棘手。我有一个包含2列thread_tag_map的表:thread_id和tag_name。

  thread_id tag_name
  1         football
  1         manchester
  2         manchester
  2         england
  3         england
  3         queen
  4         queen
  4         diana

因为你可以看到一个线程可以有多个标签,这给了我们标签的链接效果。

如果您输入标签足球,我希望它显示所有相关标签到足球。也就是说曼彻斯特,英格兰,女王和戴安娜。

所以这是迄今为止我编码的内容:

    // get all thread_id:s for tag_name
    $query = "SELECT *
            FROM thread_tag_map
            WHERE tag_name = 'football'";

    $result1 = mysqli_query($conn, $query) or die ("Couldn't execute query: " . mysqli_error($conn));

    // get all tag_name:s for each thread_id
    while($row = mysqli_fetch_assoc($result1))
    {
        $thread_id = $row['thread_id'];

        $query = "SELECT *
                FROM thread_tag_map
                WHERE thread_id = $thread_id";

        $result2 = mysqli_query($conn, $query) or die ("Couldn't execute query: " . mysqli_error($conn));

    // add each tag to array
    while($row = mysqli_fetch_assoc($result2))
    {
        $tag_array[] = $row['tag_name'];
      }
   }

但这只是给我足球和曼彻斯特。我不知道我怎么能继续使它成为一个好的代码循环(for循环?)它通过。也许有100个相关的标签。

我想你理解这个想法。有人曾经这样做过吗?

2 个答案:

答案 0 :(得分:1)

你可以用图论来形式化你想要做的事情。在给定邻接列表(sort-of)的情况下,您希望所有连接的节点都到达给定节点。 为此,您需要先对图表进行广度搜索。这对于避免循环很重要。

你所选择的表现形式并不完全有效,但肯定能奏效。

在伪代码中,您的算法应如下所示:

interesting-tags = input-tag
output = empty
for tag in interesting-tags:  (Must be in order)
    select related-tags to tag
    for newtag in related-tags:
        if newtag is not in output:
             append newtag to interesting-tags and output

return output

所以在这里,有趣的标签应该是某种形式的队列,因为你需要在后面添加新项目并从前面获取它们。

输出应该是一个Set数据类型,因为您需要检查集合中是否已有东西,然后添加它们。

然而,我不熟悉PHP,所以我不知道你可以使用什么。至少,你可以只使用一个数组来实现所需的操作,即使它可能不是完全有效,它也适用于一些标记。

答案 1 :(得分:0)

如果您正在构建某种论坛/讨论区,并且如果通过相关标签表示在与主题/论坛相关的主题中发布的所有标签,那么选择它们会更容易吗? ?由于您根据线程创建了标签,因此它们应该正确放置,因此您只需将它们全部放入。

另外,我建议您为此目的创建一个临时表,一旦需要它就存储“相关标签”,将数组保存在该表中以供将来搜索,并更新它当一些新单词作为标签给出时。

相关问题