0

次のような「関係」マトリックスがあります。

+---------+------------+------------+------------+ ------------+------------+
| | 名前 | アルバート | アルバート | ボブ | チャールズ | デール | デール | イーサン |
+---------+------------+------------+------------+ ------------+------------+
| | アルバート | アルバート | | | 0 | 1 | 1 | -1 |
| | ボブ | | | | | 1 | -1 | 1 |
| | チャールズ | | | | | | | 0 | 1 |
| | デール | デール | | | | | | | | | 0 |
| | イーサン | | | | | | | | | | |
+---------+------------+------------+------------+ ------------+------------+
 0 はお互いを知らないことを意味します
 1は彼らがお互いを好きであることを意味します
-1 はお互いが好きではないことを意味します

ここで、2 つの名前を入力して、相互に知られている人の数を取得し、「好き」を合計してその関係を「推測」します (1 つの SELECT が望ましい)。


たとえば、チャールズとデールのペアを見てみましょう。

チャールズは、デールも知っているアルバートとボブを知っています。
チャールズはアルバート(+1)が好きでデール(+1)が好きで、チャールズはボブ(+1)が好きだがボブはデールが好きではない(-1)ので、チャールズとデールの関係はおそらく友好的でしょう。

したがって、出力は 2 人の相互に知られている人物と +3 の「推測」になります。


機能的な副選択クエリについて理解できません。さらに、マトリックスが半分しか満たされていないという事実により、複雑になっているようです (名前が最初のインデックスである場合もあれば、2 番目のインデックスである場合もあります)。

誰かが役に立つクエリを作成するのを手伝ってくれませんか?

4

1 に答える 1

1

上記のコメントに従って、テーブル構造をより適切なものに変更する必要があります。したがって、次のようなテーブルを想定しています。

Person - 列: (PersonId, Name)

PersonRelationships - 列: (Person1Id、Person2Id、Relationship)

次に、クエリは次のようになります。

DECLARE @Person1Id INT;
DECLARE @Person2Id INT;
SET @Person1Id = 1;
SET @Person2Id = 2;

SELECT SUM(r1.Relationship + r2.Relationship)
(
    SELECT 
      Person2Id AS CommonRelatedPersonId, Relationship
    FROM PersonRelationships
    WHERE Person1Id = @Person1Id
    UNION 
    SELECT 
      Person1Id AS CommonRelatedPersonId, Relationship
    FROM PersonRelationships
    WHERE Person2Id = @Person1Id
) r1
JOIN 
(
    SELECT 
      Person2Id AS CommonRelatedPersonId, Relationship
    FROM PersonRelationships
    WHERE Person1Id = @Person2Id
    UNION 
    SELECT 
      Person1Id AS CommonRelatedPersonId, Relationship
    FROM PersonRelationships
    WHERE Person2Id = @Person2Id
) r2 ON r1.CommonRelatedPersonId = r2.CommonRelatedPersonId;

構文エラーがあればご容赦ください。私は MS SQL Server 構文に慣れています。それでも、概念を理解できるはずです。関係テーブルが必要で、人々をリンクし、リンクがどちらの方向にもあると仮定する必要があります (したがって、上記のユニオン)

2 つの組合 (A-> B + B -> A) のコピーを共通の関係者に結合し、合計を合計すると、そこにいます。

于 2013-09-02T09:45:53.650 に答える