用于处理复杂关系的SQL查询

时间:2011-01-29 16:07:48

标签: sql mysql join

我有一个场景,我有很多博客。这些博客都有多个帖子。每篇博客文章都可以链接到另一篇博客上的帖子,但是他们应该永远不会从该博客链接回链接博客。

澄清:

  • 站点A链接到站点B(并且可以链接到其他站点)
  • 网站B然后无法链接到网站A(但可以链接到其他网站)

每次发布​​帖子时,我都会存储帖子的ID以及链接到的网站的ID。重要的是要记住,一旦一个帖子链接到另一个网站上的任何帖子,其他网站无法链接回任何地方,而不仅仅是链接到的帖子。

网站A可以根据需要多次链接到网站B,每个帖子可能会链接到多个其他帖子。示例场景可能是:

  • 站点A指向站点B的链接
  • 站点C链接到站点B
  • 站点D链接到站点A

在以上数据中:

  • 网站A可以链接到网站C(或网站B)
  • 网站B可以链接到网站D
  • 网站C可以链接到网站A或网站D(或网站B)
  • 网站D可以链接到网站B或网站C(或网站A)

以下是一些测试数据的链接以及所需的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子查询,但我不确定确切的子句(或者这是否是正确的方法)。

1 个答案:

答案 0 :(得分:3)

如果我错了,请纠正我。您的任务似乎是确定有向图中的周期。它看起来并不复杂。请参阅此博客文章,了解它在SQL中的完成情况:http://devio.wordpress.com/2009/09/13/finding-cycles-in-directed-graphs-using-tsql/。另请参阅此链接以获取SQL中的广度优先搜索:http://willets.org/sqlgraphs.html

已编辑:添加图像是为了清晰和理解有向无环和循环图。

例如,这里有类似于你的情况。它不是单个图形而是一组图形(如果它们是树木则为森林)。请注意,没有共同的根。它只是以某种方式连接的节点。更大的子图中有一个循环,节点相互引用。如果要向上移除链接,子图将变为非循环。

enter image description here