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

MySQL查询单向链接的复杂关系,mysql,database,relationship,Mysql,Database,Relationship,我已经思考了一段时间了。基本上,我有一个表中的网站列表。每个网站都有几个帖子。每个帖子都可以链接到至少一个其他网站。我记录了哪些链接在哪里。我需要生成一个查询,给我一个特定帖子可以链接到的所有网站的列表。然而,对此有一些规则: 每个帖子都可以链接到多个网站每个帖子只能链接到没有帖子链接的网站每个帖子都可以多次链接到同一个网站(因此,如果以前链接过,也可以)一个网站可以链接到自己的帖子 下面是我的网站,每个网站都有一些帖子。 现在,如果我添加A的所有可能链接: 但现在,没有其他站点能够链接回A

我已经思考了一段时间了。基本上,我有一个表中的网站列表。每个网站都有几个帖子。每个帖子都可以链接到至少一个其他网站。我记录了哪些链接在哪里。我需要生成一个查询,给我一个特定帖子可以链接到的所有网站的列表。然而,对此有一些规则:

  • 每个帖子都可以链接到多个网站
  • 每个帖子只能链接到没有帖子链接的网站
  • 每个帖子都可以多次链接到同一个网站(因此,如果以前链接过,也可以)
  • 一个网站可以链接到自己的帖子
    • 下面是我的网站,每个网站都有一些帖子。

      现在,如果我添加A的所有可能链接:

      但现在,没有其他站点能够链接回A,因为A正在链接到它们(规则2)。请参见下面C可以链接到的内容:

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

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

      我不是在这里偷懒,只是让你为我写一个查询。我花了很长时间试图解决这个问题,但不知道从哪里开始

      以下是一些示例数据和表结构的链接:

      通过使用交叉连接,我能够产生接近所有结果的结果:

      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
      

      我确实根据您提供的数据进行了测试,并确保得到了正确的结果。似乎可以处理测试数据和我的实时数据。我将实施它,看看它是如何运行的。说真的,非常感谢你花时间看它-有点奇怪,因为它感觉应该很简单,但事实并非如此。是的,我本以为它会简单地加入,但玩了之后我意识到我不能。我不是SQL方面的专业人士,但因为你需要一个“不在”,所以我想到了这一点。