1

我在 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.3.3 登录

因此,对于成员 1:

  • 关联成员: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')

======香卡的建议====

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

如果你尝试,我只能得到关联成员 = member1,member3。

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

4

2 回答 2

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

于 2012-04-20T06:32:59.133 回答
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
于 2012-04-20T08:00:12.577 回答