4

私はソーシャルウェブサイトプロジェクトに取り組んでおり、連絡先の「第1、第2、第3度の連絡先」をリストする必要があります。SQL ServerとC#を使用しています

次のようなテーブルを想定しcontactます。

ここに画像の説明を入力してください

一次連絡の場合:

  • 私の場合gulsah、私の最初の学位の連絡先はburak,sennur

これを選択するために使用するクエリ:

SELECT contact_2 FROM Contacts_Table WHERE contact_1 like 'gulsah'

2度目の連絡先:

gulsahが再びいる場合、私の2度目の連絡先は次のとおりです。 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

このクエリは機能しますが、私が言ったように、それはこの仕事のための正しいアプローチではありません。

3度の連絡先:

もう一度私ならgulsah、私の3度の連絡先は_ mehmet,ahmet

1度目と2度目の連絡先ではない連絡先の連絡先を選択する必要があります:)

これがLinkedinからの連絡先レベルを説明する投稿です。

回答ありがとうございます。

4

3 に答える 3

2

難しいのは、私の第 1 次連絡先ではない私の連絡先の連絡先を選択することです。

EXCEPT演算子を使用できます。

一次連絡先:

SELECT contact_2 FROM contact WHERE contact_1 = 'gulsah'

第1度接触者ではない第2度接触者:

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'

EXCEPTSELECTは、2 番目の に表示されない最初の結果をすべて返すように SQL サーバーに指示しますSELECT

第 3 度接触者 (第 1 度接触者または第 2 度接触者ではない) の場合:

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します。

于 2011-04-24T09:02:14.380 に答える
1

これが私のアプローチです:

  1. 私の連絡先を特別な収集済み連絡先リストに追加します。

  2. 連絡先テーブルの時点で収集されたリスト内のすべての連絡先について、その連絡先が収集されたリストに既に含まれていない限りContact_1、対応する連絡先を追加します。Contact_2

  3. ステップ 2 を目標度数から 1 を引いた回数繰り返します。

  4. 手順 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、必要に応じて簡単に置き換えることができます。

于 2011-04-24T14:53:56.557 に答える
0

たぶんこれが役立ちます: http://techportal.ibuildings.com/2009/09/07/graphs-in-the-database-sql-meets-social-networks/

于 2011-04-24T09:04:13.000 に答える