我正在开展一个社交网站项目,我需要列出我的联系人的“一级,二级和三级联系人”。我正在使用SQL Server AND C#
假设contact
表格如下:
对于第一学位联系:
gulsah
是我,那么我的第一学位联系人是burak,sennur
查询我用来选择:
SELECT contact_2 FROM Contacts_Table WHERE contact_1 like 'gulsah'
第二学位联系:
如果gulsah
再次成为我,那么我的第二学位联系人是:mali
选择不是我的第一学位联系人的联系人的联系人是很困难的。
我可以选择相互联系,但我想这不是正确的方法。
例如,要选择我(gulsah
)和burak
的相互联系人:
SELECT contact_1 FROM (SELECT * FROM Contact_Test
WHERE contact_2 like 'burak') a
INNER JOIN (SELECT contact_1 FROM Contact_Test
WHERE (contact_2 = 'gulsah')) b
ON a.contact_1 = b.contact_1
这个查询有效,但正如我所说,这不适合这项工作。
对于三级联系:
如果我再次gulsah
,那么我的第三学位联系人为mehmet,ahmet
我需要选择不是我的第一和第二学位联系人的联系人联系人的联系人:)
Here is a post from Linkedin which explains contact level.
感谢您的回复。
答案 0 :(得分:2)
选择不是我的第一学位联系人的联系人的联系人是很困难的。
您可以使用EXCEPT
运算符。
一级联系人:
SELECT contact_2 FROM contact WHERE contact_1 = 'gulsah'
非一级联系人的二级联系人:
SELECT
contactB.contact_2
FROM
contact AS contactB
INNER JOIN contact AS contactA ON contactA.contact_2=contactB.contact_1
WHERE contactA.contact_1 = 'gulsah'
EXCEPT
SELECT contact_2 FROM contact WHERE contact_1 = 'gulsah'
EXCEPT
告诉SQL服务器返回第一个SELECT
中未出现在第二个SELECT
中的所有结果。
对于三级联系人(不是一级或二级联系人):
SELECT
contactC.contact_2
FROM
contact AS contactC
INNER JOIN contact AS contactB ON contactB.contact_2=contactC.contact_1
INNER JOIN contact AS contactA ON contactA.contact_2=contactB.contact_1
WHERE contactA.contact_1 = 'gulsah'
EXCEPT
(
SELECT contact_2 FROM contact WHERE contact_1 = 'gulsah'
UNION
SELECT
contactB.contact_2
FROM
contact AS contactB
INNER JOIN contact AS contactA ON contactA.contact_2=contactB.contact_1
WHERE contactA.contact_1 = 'gulsah'
)
我对表演并不抱太大希望,但当然你需要亲自检查一下。
作为旁注:
I can select mutual contacts but I guess it is not the right approach.
请使用INTERSECT
。
答案 1 :(得分:1)
这是我的方法:
将我的联系人添加到特殊收集的联系人列表中。
对于收集列表中作为联系人表格Contact_1
的每个联系人,请添加其对应的Contact_2
,除非该联系人已在收集的列表中。
重复步骤#2目标学位数减去1的次数。
再次在步骤#2中重复查询,但这次只返回结果集(不要将行添加到收集的列表中)。
剧本:
DECLARE @MyContact varchar(50), @DegreeNumber int;
SET @MyContact = 'gulsah';
SET @DegreeNumber = 3;
DECLARE @CollectedContacts TABLE (Contact varchar(50));
INSERT INTO @CollectedContacts (Contact) VALUES (@MyContact);
WHILE @DegreeNumber > 1 BEGIN
INSERT INTO @CollectedContacts (Contact)
SELECT ct.Contact_2
FROM Contacts_Table ct
INNER JOIN @CollectedContacts cc ON ct.Contact_1 = cc.Contact
LEFT JOIN @CollectedContacts cc2 ON ct.Contact_2 = cc2.Contact
WHERE cc2.Contact IS NULL;
SET @DegreeNumber = @DegreeNumber - 1;
END;
SELECT ct.Contact_2
FROM Contacts_Table ct
INNER JOIN @CollectedContacts cc ON ct.Contact_1 = cc.Contact
LEFT JOIN @CollectedContacts cc2 ON ct.Contact_2 = cc2.Contact
WHERE cc2.Contact IS NULL;
正如您所看到的,学位数和“我的”联系人都是可以参加的。我正在使用varchar
类型的联系人,但如果需要,当然可以轻松地将其替换为int
。
答案 2 :(得分:0)