[英]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.