0

我有一个“关系”矩阵,例如:

+---------+------------+------------+------------+ ------------+------------+
| 姓名 | 阿尔伯特 | 鲍勃 | 查尔斯 | 戴尔 | 伊桑 |
+---------+------------+------------+------------+ ------------+------------+
| 阿尔伯特 | | 0 | 1 | 1 | -1 |
| 鲍勃 | | | 1 | -1 | 1 |
| 查尔斯 | | | | 0 | 1 |
| 戴尔 | | | | | 0 |
| 伊桑 | | | | | |
+---------+------------+------------+------------+ ------------+------------+
 0 表示他们彼此不认识
 1表示彼此喜欢
-1 表示他们不喜欢对方

现在,我想输入两个名字并获得共同认识的人的数量,并通过将“喜欢”相加来“推测”他们的关系(最好在一个 SELECT 中)。


以查尔斯和戴尔为例:

查尔斯认识阿尔伯特和鲍勃,他们也认识戴尔。
查尔斯和戴尔之间的关系可能是友好的,因为查尔斯喜欢阿尔伯特(+1),阿尔伯特喜欢戴尔(+1),查尔斯喜欢鲍勃(+1),尽管鲍勃不喜欢戴尔(-1)。

因此,输出将是 2 个共同认识的人和 +3 的“推测”。


我无法理解功能性子选择查询,再加上矩阵只有一半填充的事实似乎使它更复杂(有时名称是第一个索引,有时是第二个)。

有人可以帮我制定一个有用的查询吗?

4

1 回答 1

1

根据上面的评论,您应该将表结构修改为更合理的内容。所以我们假设表格如下:

人员- 列:(PersonId,姓名)

PersonRelationships - 列:(Person1Id、Person2Id、关系)

然后查询可能如下所示:

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 回答