从SQL数据构建关联矩阵

时间:2012-04-20 05:50:41

标签: sql associations tracking

我在SQL Server中有一个表来记录我网站所有成员登录的IP。

    ID   MEMBER      IP       
    ---------------------------------------
    1    member1     1.1.1.1
    2    member2     2.2.2.2
    3    member3     1.1.1.1
    4    member3     3.3.3.3
    5    member4     3.3.3.3

我想找出一种搜索关联成员及其相关IP的方法。

第一个例子,

  • member1从1.1.1.1之前登录
  • member3从1.1.1.1和3.3.3.3之前登录
  • member4从<3.3>之前登录

所以,对于member1:

  • 关联成员:member1,member3,member4
  • 相关IP:1.1.1.1,3.3.3.3

对于member2,关联成员是member2,关联IP是2.2.2.2。

此关联系统用于帮助管理假玩家,并且成员数量很大(~100k)。因此加载时间是一个大问题。

我的问题:

  • 是否有SQL查询来生成关联成员和关联IP的列表?

=======要测试的表======

CREATE TABLE [dbo].[tblAssociation](
    [ID] [int] NULL,
    [Member] [nvarchar](50) NULL,
    [IP] [nvarchar](50) NULL
) ON [PRIMARY]

GO

INSERT INTO [tblAssociation] VALUES(1,'member1','1.1.1.1')
INSERT INTO [tblAssociation] VALUES(2,'member2','2.2.2.2')
INSERT INTO [tblAssociation] VALUES(3,'member3','1.1.1.1')
INSERT INTO [tblAssociation] VALUES(4,'member3','3.3.3.3')
INSERT INTO [tblAssociation] VALUES(5,'member4','3.3.3.3')

====== shankar的建议====

SELECT T1.Member, T1.IP, T2.Member 
FROM   tblAssociation T1 
INNER JOIN tblAssociation T2 ON T1.IP = T2.IP
AND T1.Member = 'member1'

如果你尝试,我只能获得关联的member = member1,member3。

member4不存在,但他应该关联,因为member4和member3之前连接到3.3.3.3

2 个答案:

答案 0 :(得分:1)

通过缩小问题范围,您有更好的机会获得更具体的答案。

如果您的问题只是查询关联,那么您可以这样做:

如果您的表名是MyTable,并且您想要查看其关联的成员是@MemberID,那么这样做

SELECT T1.MEMBER, T1.IP, T2.MEMBER 
FROM   MyTable T1 
       INNER JOIN MyTable T2 ON T1.IP = T2.IP
                                AND T1.ID = @MemberID

上面的查询只提供了第一级关联,可以使用CTE一直使用递归

http://msdn.microsoft.com/en-us/library/ms186243.aspx

答案 1 :(得分:0)

在与shankar_pratap相同的语句的基础上,在CTE之后,您将获得给定成员的所有相关成员。这里真正的困难在于知道何时停止递归。对于要停止的递归,q.ID <> a.IDq.OriginalID <> r.ID都是必需的。

SQL声明

;WITH q AS (
  SELECT  OriginalID = r.ID
          , r.ID
          , r.Member
          , r.IP
  FROM    tblAssociation a
          INNER JOIN tblAssociation r ON r.IP = a.IP
  WHERE   a.Member = 'member1'
  UNION ALL
  SELECT  q.OriginalID
          , r.ID
          , r.Member
          , r.IP
  FROM    tblAssociation a
          INNER JOIN tblAssociation r ON r.IP = a.IP
          INNER JOIN q ON q.Member = a.Member AND q.ID <> a.ID
  WHERE   q.OriginalID <> r.ID
)
SELECT  DISTINCT ID
        , Member
        , IP
FROM    q

<强>结果

ID  Member  IP
1   member1 1.1.1.1
3   member3 1.1.1.1
4   member3 3.3.3.3
5   member4 3.3.3.3