MYSQL 查询以根据查询结果从同一 table 中的 2 个不同记录中提取数据

MYSQL query to pull data from 2 different records in same table based on query result

有关上下文,请查看此处:

基本上,我试图在不将关系和家庭绑定到一个 "head of household" 的情况下绘制人与家庭之间的关系图。到目前为止,我认为我的模型运行良好。这是有效的:

SELECT person.person_id,person.first_name, relationship.person_id_a, relationship.person_id_b, relationship.relationship_cd
FROM person, relationship
WHERE person_id = 1
AND (person.person_id = relationship.person_id_a
OR person.person_id = relationship.person_id_b)
AND relationship.relationship_cd <> 0;

结果:

"person_id" "first_name" "person_id_a" "person_id_b" "relationship_cd"
"1" "Joe"   "1" "2" "8 - Spouse"
"1" "Joe"   "1" "3" "7 - Sibling"

所以我知道乔(第 1 个人)有配偶(第 2 个人)和一个兄弟姐妹(第 3 个人)。有没有办法让我在输出中附加与乔有关系的人的姓名(或其他信息)?也就是说,查询 1 告诉我 Joe 与谁有关系(来自关系 table 的连接),我能否以这样一种方式嵌套另一个查询,然后我可以提取那个人的名字(从连接回来从人 table) 到另一条记录?所以它看起来像这样:

"person_id" "first_name" "person_id_b" "relationship_cd" "related_person_name"
"1" "Joe" "2" "8 - Spouse" "Susan"
"1" "Joe" "3" "7 - Sibling" "Bob"

我会 select 从 relationship 其中 person_id_a 或 person_id_b 等于你的人 (Joe) 的 ID 然后加入两次 person 两个和 relationship 中的 b 人。例如:

SELECT 
r.person_id_a, 
a.first_name as first_name_a,
r.person_id_b,
b.first_name as first_name_b
r.relationship_cd 
FROM relationship r
JOIN person a on a.person_id = r.person_id_a
JOIN person b on b.person_id = r.person_id_b
WHERE r.person_id_a = 1
OR r.person_id_b = 1 
AND relationship.relationship_cd <> 0;

此查询将 return 具有 person_id = 1 且名字为 person_a 和 person_b 的人的所有关系。

如果你想以你的答案中的形式获得结果,查询可以是这样的:

    SELECT 
        p.person_id,
        case when p.person_id = r.person_id_a then a.first_name else b.first_name end as first_name,
        case when p.person_id = r.person_id_a then b.person_id else a.person_id end as person_id_related,
        case when p.person_id = r.person_id_a then b.first_name else a.first_name end as first_name_related,
        r.relationship_cd 
FROM person p
JOIN relationship r ON r.person_id_a = p.person_id OR r.person_id_b = p.person_id
JOIN person a on a.person_id = r.person_id_a
JOIN person b on b.person_id = r.person_id_b
WHERE p.person_id = 1 
        AND relationship.relationship_cd <> 0;