Mysql 使用具有依赖于主查询的多个结果的子查询
我有一个名为“tc_person”的人员表和一个名为“tc_marriage”的婚姻表。我想从persons表中选择几列,并选择一列表示合作伙伴的id 婚姻表包括两个人的pid_1和pid_2,但重要的是一对夫妇只有一个条目,并且夫妇ID的顺序可能会有所不同。以下是表格: tc_人员:Mysql 使用具有依赖于主查询的多个结果的子查询,mysql,sql,Mysql,Sql,我有一个名为“tc_person”的人员表和一个名为“tc_marriage”的婚姻表。我想从persons表中选择几列,并选择一列表示合作伙伴的id 婚姻表包括两个人的pid_1和pid_2,但重要的是一对夫妇只有一个条目,并且夫妇ID的顺序可能会有所不同。以下是表格: tc_人员: | id | name | lastname | -------------------------------------- | 4 | peter |
| id | name | lastname |
--------------------------------------
| 4 | peter | smith |
| 5 | sarah | smith |
tc_婚姻:
| id | pid_1 | pid_2 |
--------------------------------------
| 0 | 5 | 4 |
| 1 | 7 | 9 |
我的子查询似乎在原始select语句之前被解释为一个整体。现在我得到一个错误,我的子查询返回多行
SELECT p.id, p.name, p.lastname,
(SELECT m.pid_1 FROM tc_marriage m WHERE m.pid_2 = p.id UNION
SELECT m.pid_2 FROM tc_marriage m WHERE m.pid_1 = p.id) as partner_id
FROM tc_person p WHERE p.lastname LIKE 'smith';
我正在寻找以下输出:
| id | name | lastname | partner_id |
-----------------------------------------------------
| 4 | peter | smith | 5 |
| 5 | sarah | smith | 4 |
只有一个查询就可以做到这一点吗?到现在为止,你可能已经知道我是个不折不扣的SQL高手了。也许你们能帮上忙。你们可以用IN来避免结合(通常比较慢),用CASE语句来选择正确的合作伙伴id:
SELECT p.id,
p.name,
p.last_name,
CASE p.id WHEN m.pid_1 THEN m.pid_2 ELSE m.pid_1 END AS partner_id
FROM tc_person p
JOIN tc_marriage m ON p.id IN (m.pid_1, m.pid_2)
您要做的是将person表连接到婚姻表。然而,问题是你有两把钥匙。一种解决方案是进行两次联接,然后通过一些逻辑来选择正确的值 我更喜欢通过交换伴侣来“翻倍”婚姻表。以下查询在子查询中采用此方法:
select p.id, p.name, p.lastname, partner_id
from tc_person p join
(select pid_1 as firstid, pid_2 as partner_id
from marriage
union all
select pid_2 as firstid, pid_1 as partner_id
from marriage
) m
on p.id = m.firstid