SQL Server:如何选择一级,二级和三级联系人

时间:2011-04-24 05:51:43

标签: sql sql-server-2008 contacts contact-list

我正在开展一个社交网站项目,我需要列出我的联系人的“一级,二级和三级联系人”。我正在使用SQL Server AND C#

假设contact表格如下:

enter image description here

对于第一学位联系:

  • 如果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.

感谢您的回复。

3 个答案:

答案 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)

这是我的方法:

  1. 将我的联系人添加到特殊收集的联系人列表中。

  2. 对于收集列表中作为联系人表格Contact_1的每个联系人,请添加其对应的Contact_2,除非该联系人已在收集的列表中。

  3. 重复步骤#2目标学位数减去1的次数。

  4. 再次在步骤#2中重复查询,但这次只返回结果集(不要将行添加到收集的列表中)。

  5. 剧本:

    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)