我在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:
对于member2,关联成员是member2,关联IP是2.2.2.2。
此关联系统用于帮助管理假玩家,并且成员数量很大(~100k)。因此加载时间是一个大问题。
我的问题:
=======要测试的表======
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
答案 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一直使用递归
答案 1 :(得分:0)
在与shankar_pratap相同的语句的基础上,在CTE
之后,您将获得给定成员的所有相关成员。这里真正的困难在于知道何时停止递归。对于要停止的递归,q.ID <> a.ID
和q.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