2009-12-04 193 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,所以我不知道什麼是提供給您。至少,你可以用一個數組來實現你需要的操作,即使它可能不是完全有效的,它可以用於一些標籤。