2009-12-04 194 views
0

这是非常棘手的。我有一个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个相关的标签。

我想你明白这个主意。有人做过这个吗?

回答

0

如果你正在构建某种论坛/讨论板的,并且如果相关的标签,你的意思是所有被贴在了板/论坛相关主题的标签,我就不会是更容易,只是他们选择所有?既然你基于线程创建标签,它们应该全部正确放置,所以你只需要把它们全部放好。

另外,我建议你创建一个临时表只是为了这个目的,在这里存放“相关的标签”一旦他们需要摆在首位,并保存在该表对未来搜索的阵列,并且更新它当一些新词作为标签给出时。

1

你可以用图论形式化你想要做的一些事情。给定一个邻接列表(排序),你需要所有连接的节点给定给定的节点。 要做到这一点,您需要先对图进行宽度优先搜索。这对避免周期很重要。

尽管您选择的表示方式并不完全有效,但可以肯定有效。

在伪代码,你的算法应该是这个样子:

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 

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

输出应该是一组数据类型,因为你需要检查,如果事情已经在一套,并加入他们。

我,但是,不熟悉PHP,所以我不知道什么是提供给您。至少,你可以用一个数组来实现你需要的操作,即使它可能不是完全有效的,它可以用于一些标签。