我有一个场景,我有很多博客。这些博客都有多个帖子。每篇博客文章都可以链接到另一篇博客上的帖子,但是他们应该永远不会从该博客链接回链接博客。
澄清:
每次发布帖子时,我都会存储帖子的ID以及链接到的网站的ID。重要的是要记住,一旦一个帖子链接到另一个网站上的任何帖子,其他网站无法链接回任何地方,而不仅仅是链接到的帖子。
网站A可以根据需要多次链接到网站B,每个帖子可能会链接到多个其他帖子。示例场景可能是:
在以上数据中:
以下是一些测试数据的链接以及所需的2个表的转储: http://pastie.org/1506715
我认为我需要交叉连接来获取所有可能的链接组合,但是然后考虑现有关系以防止网站以相反方向链接回来。我到目前为止的查询是:
SELECT
t1.* , t2.* FROM test_posts t1, test_posts as t2
WHERE
t1.post_id != t2.post_id
ORDER BY
t1.post_id, t2.post_id;
这给了我帖子之间所有可能的关系。我正在努力的是如何排除违反上述规则的关系。先前的关系记录在test_smartlinks_to_websites表中,其中post_id属于“originating”网站,website_id属于“destination”网站(记住这种关系实际上是网站之间的单向关系,而不是帖子)。
我尝试使用NOT EXISTS子查询,但我不确定确切的子句(或者这是否是正确的方法)。
答案 0 :(得分:3)
如果我错了,请纠正我。您的任务似乎是确定有向图中的周期。它看起来并不复杂。请参阅此博客文章,了解它在SQL中的完成情况:http://devio.wordpress.com/2009/09/13/finding-cycles-in-directed-graphs-using-tsql/。另请参阅此链接以获取SQL中的广度优先搜索:http://willets.org/sqlgraphs.html。
已编辑:添加图像是为了清晰和理解有向无环和循环图。
例如,这里有类似于你的情况。它不是单个图形而是一组图形(如果它们是树木则为森林)。请注意,没有共同的根。它只是以某种方式连接的节点。更大的子图中有一个循环,节点相互引用。如果要向上移除链接,子图将变为非循环。