[英]get all related tags?
這非常棘手。 我有一個包含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'];
}
}
但這給了我足球和曼徹斯特。 我不知道如何繼續使它成為循環播放(循環)的好代碼。 也許有100個相關標簽。
我想你明白這個主意。 有人做過這個嗎?
您可以在這里用圖論來形式化您要嘗試做的事情。 您希望將所有連接的節點連接到給定的節點,並給出一個鄰接列表(排序)。 為此,您需要對圖形進行廣度優先搜索。 這對於避免循環很重要。
盡管您選擇的表示形式並不完全有效,但是肯定可以。
在偽代碼中,您的算法應如下所示:
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,所以我不知道有什么可用。 至少,您可以只用一個數組來實現所需的操作,即使它可能不是完全有效的,它也適用於一些標簽。
如果您要構建某種類型的論壇/討論板,並且用相關標簽來表示所有與委員會/論壇相關的主題中發布的標簽,那么將它們全部選中會不會更容易? 由於您是基於線程創建標簽的,因此應該正確放置所有標簽,因此您只需要全部獲取它們。
另外,我建議您為此目的創建一個臨時表,首先將“相關標簽”存儲在其中,然后將其保存在該表中以供將來搜索,並在需要時對其進行更新單詞作為標簽給出。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.