代码之家  ›  专栏  ›  技术社区  ›  Niko Gamulin

选择n个连接度内的所有用户

  •  3
  • Niko Gamulin  · 技术社区  · 14 年前

    该表由列user1、user2、connectionstrength组成,示例记录如下:

    A,B,0.2
    A,C,0.5
    A,G,0.1
    B,C,0.8
    W,Q,0.4
    G,Q,0.5
    

    我想检索所选用户在定义的连接程度内的所有用户,然后绘制连接图。然而,问题是如何从满足条件的表中选择所有记录。例如,如果选择了用户A,并且将度设置为2,则应选择示例中的以下记录:

    A,B,0.2
    A,C,0.5
    A,G,0.1
    B,C,0.8
    G,Q,0.5
    

    上面的例子是假设的。实际上,我所处理的数据库中有超过200万个连接,目前我使用C和Microsoft SQL Server 2008进行分析。

    有人知道如何编写函数(string getquery(string selected user,int degree of connection))来组成一个查询,该查询返回满足条件的所有记录(所选用户的连接程度)?

    编辑1

    我尝试通过以下方式执行递归查询来获取连接:

    WITH user_connections(user1, user2, link_strength, Level)
    AS
    (
    SELECT user1, user2, link_strength, 0 AS Level FROM [dbo].[monthly_connections] AS mc WHERE user1 = '1ADF1126F26B4AD4441A3C552FCE04A4F7A79760'
    UNION ALL
    SELECT mc.user1, mc.user2, mc.link_strength, Level + 1 FROM [dbo].[monthly_connections] AS mc INNER JOIN user_connections AS uc ON uc.user2 = mc.user1
    )
    SELECT user1, user2, link_strength FROM user_connections OPTION(MAXRECURSION 1)
    

    到目前为止,查询已经执行了40多分钟,所以如果有人能检查语句的组成是否正确,我将非常感谢。

    谢谢您!

    3 回复  |  直到 14 年前
        1
  •  2
  •   Daniel Schaffer    14 年前

    SQL 2005及更高版本允许您使用 Common Table Expressions . 文档中的示例应该足以让您开始。

        2
  •  1
  •   CodesInChaos    14 年前

    由于联系人数量随连接程度呈指数级增长,因此快速实现该搜索确实存在问题。我会尝试一个中间相遇的算法。从这两个用户中找到n/2度的联系人,然后检查这两组人是否有共同点。

    如果您经常需要这些查询,您可能会考虑不在数据库中运行它们,而是将连接加载到查找中并在C_中运行查询。按流行程度排序查找中的价值用户也可以提高性能。因为这种联系更可能通过一个受欢迎的人发生。