如何在SQL中遍历此指定关系模型?

时间:2019-02-19 21:46:34

标签: mysql sql

我有一个数据库,其中包含一个名为“ Relations”的表,如下所示:

Relations (PersonId1, PersonId2, RelationTypeId)

主键为(PersonId1, PersonId2, RelationTypeId)

还有另外两个表,它们引用外键,但这在这里并不重要。

因此定义了一个关系,例如(Mary, Andre, 3),其中3将被引用到另一个表,并且意味着例如(“朋友”)。

我的要求是要看到指定人的所有朋友,而且还要看到人中朋友的朋友,所以不仅要看到第一层,还要看到第二层。

例如,这就是关系表

Andre   Mary    3
Mary    Carl    3
Chris   James   3 (irrelevent in our case)

所以我想要一个查询,其中有Andre的PersonId和RelationTypeId。结果应该是这样:

Andre   Mary    3
Mary    Carl    3

以我的理解,不可能构建出可以给出此结果的查询,但是我不确定,这就是为什么我想知道它。

希望您能理解我的问题,谢谢。

2 个答案:

答案 0 :(得分:0)

下面的查询将返回person1及其朋友的朋友列表。

select 
   distinct personId2
from 
   relations 
where 
   personId1 in (select distinct personId2 from relations where personId1 = <person_name>) 
or personId1 = <person_name>

答案 1 :(得分:0)

这是递归CTE(通用表格表达式)。由于主SELECT查询会递归调用CTE部分,因此它将多次处理查询结果。 CTE是SELECT查询(以WITH开头)的一部分。此代码将返回您要查找的数据子集。

当需要(例如,选择,分页或显示与特定页面链接的页面行等)时,我用它来提高数据访问效率。它在MySQL 8中确实有效。