MySQL查询单向链接的复杂关系

标签 mysql database relationship

我一直在思考这个问题。基本上我在表格中有一个网站列表。这些网站中的每一个都有几个帖子。每个帖子都可以链接到至少一个其他网站。我记录了哪些链接在哪里。我需要生成一个查询,为我提供某个帖子可能链接到的所有网站的列表。但是,有一些规则:

  • 每个帖子可以链接到多个网站
  • 每个帖子只能链接到没有帖子链接回它的网站
  • 每个帖子可以链接到同一个网站多次(所以如果它过去被链接过,那很好)
  • 一个网站可以链接到它自己的帖子

下面是我的网站的代表,每个网站都有一些帖子。 http://img140.imageshack.us/img140/815/emptyd.jpg

现在,如果我添加 A 的所有可能链接:
http://img834.imageshack.us/img834/4931/alinks.jpg

但是现在,没有其他站点能够链接回 A,因为 A 正在链接到它们(规则 2)。请参阅下面 C 可以链接到的内容:
http://img39.imageshack.us/img39/273/clinks.jpg

因此,现在 A 或 C 链接到的任何内容都无法链接回它,这降低了每个其他站点的选项。重要的是要记住,并非每个网站都会链接到所有可能的组合,我只需要从查询中返回这些组合。如果你看下面我添加了来自 G 和 D 的链接,这些并不是它们产生的所有可能的链接,只是一些可能的链接: D and G linking http://img689.imageshack.us/img689/7140/dglinks.jpg

它现在开始成形了。您会注意到现在很多网站都链接到 H,因此 H 的链接选项非常有限。事实上,它只能链接到 F、B、E 和它本身(规则 4)。

我不是偷懒,只是请您帮我写一个查询。我花了很长时间试图解决这个问题,但不确定从哪里开始。

这是一些示例数据和表结构的链接: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;

我觉得它很接近,但我只是不在那里。我想我需要在子查询中使用 NOT EXISTS 子句,但我不确定我到底需要什么。

最佳答案

我在这上面花了大约一个小时,我可以告诉你一件事,这很难。我尝试了很多不同的方法来得到答案,我想出的方法似乎不太有效,但却是唯一的方法。

您正在寻找差异,这意味着我选择了所有尚未设置组合的可能组合。这说起来似乎很奇怪,但这就是正在发生的事情。

SELECT post.post_id, website.website_id
FROM test_posts post
  JOIN test_posts website ON website.website_id NOT IN
(
  SELECT sl.website_id
  FROM test_posts f
    INNER JOIN test_smartlink_to_websites sl ON f.post_id = sl.post_id
  WHERE f.post_id = post.post_id
)
ORDER BY post_id

关于MySQL查询单向链接的复杂关系,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4914272/

相关文章:

mysql - 如何在大于 23 :59:59 的时间上使用模 24 小时格式

mysql - Bash:使失败的 zip 变得冗长

mysql - 汇总表格的一列并将总和转移到另一个表格

数据库优化 : What's faster searching by integers OR short strings?

ruby-on-rails - Neo4j gem - 查询不存在的关系

php - Laravel - 选择多对多关系的特定列

MySQL浮点比较问题

mysql - MySQL中如何插入含有较多特殊字符的记录?

c# - 我在设置使用简单数据库实现的网站时遇到问题

javascript - 在 Canvas 上寻找定制(加入 div 并保持它的关系)