【问题标题】:SQL Finding all related entriesSQL 查找所有相关条目
【发布时间】:2011-12-01 20:19:01
【问题描述】:

拥有一张用户表,任何用户都可以与其他用户建立友谊。所以,

UserTable
-----------
User1
User2
User3


FriendshipTable
-----------
User1, User3
User2, User5
User3, User5
User5, User9

第 1 部分:我正在寻找一种方法来获取完整的朋友、朋友的朋友等。例如 User1 将返回:User1、User5、User2、User9

第 2 部分:如果我能获得最大的人脉网络的规模,这将是有用的,但不是必需的

或者,是否有更好的方法来存储用户之间的连接,从而更轻松地提取我需要的信息?就像在创建友谊时建立和合并一个友谊组列表?

我在这里找到了一些类似的帖子,但它们似乎都没有超过第一级深度。

我想那里有解决方案,但我什至不知道要搜索什么。

【问题讨论】:

  • MSSQL 2008 和 .NET 解决方案不必只有 SQL,我想我需要一些临时表和递归。
  • 如果是 SQL 2K8,您可以使用递归 CTE 并指定 MAXRECUSION 选项,在 0(无限制)或某个已知限制。 FoF 可以非常迅速地扩展,并将在关系图中包含循环。
  • 我也在考虑 CTE。到目前为止,我发现的 CTE 递归示例都在同一个表中的记录之间使用父/子层次关系。我还没有遇到过使用我可能需要的第二个关系表的演示。

标签: .net sql sql-server-2008 many-to-many data-modeling


【解决方案1】:

CTE 是要走的路(但如果你想在朋友之间获得大量的分离度,你需要小心使用 MAXRECURSION)。在您的情况下, UserTable 实际上是无关紧要的。你关心的只是关系表(FriendshipTable)。

CREATE TABLE #UserFriendship (User1 VARCHAR(20), User2 VARCHAR(20))

INSERT #UserFriendship VALUES ('A', 'B')
INSERT #UserFriendship VALUES ('B', 'C')


;WITH friends AS
(
    SELECT User1, User2 
    FROM #UserFriendship
    UNION ALL
    SELECT friends.User1, child.User2
    FROM friends
    JOIN #UserFriendship child ON
        friends.User2 = child.User1
)
SELECT * FROM friends

【讨论】:

    猜你喜欢
    • 2020-03-26
    • 2022-12-04
    • 1970-01-01
    • 2011-12-11
    • 1970-01-01
    • 2021-02-05
    • 2022-08-13
    • 2021-11-07
    • 1970-01-01
    相关资源
    最近更新 更多