Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/asp.net-core/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Mysql 使用具有依赖于主查询的多个结果的子查询_Mysql_Sql - Fatal编程技术网

Mysql 使用具有依赖于主查询的多个结果的子查询

Mysql 使用具有依赖于主查询的多个结果的子查询,mysql,sql,Mysql,Sql,我有一个名为“tc_person”的人员表和一个名为“tc_marriage”的婚姻表。我想从persons表中选择几列,并选择一列表示合作伙伴的id 婚姻表包括两个人的pid_1和pid_2,但重要的是一对夫妇只有一个条目,并且夫妇ID的顺序可能会有所不同。以下是表格: tc_人员: | id | name | lastname | -------------------------------------- | 4 | peter |

我有一个名为“tc_person”的人员表和一个名为“tc_marriage”的婚姻表。我想从persons表中选择几列,并选择一列表示合作伙伴的id

婚姻表包括两个人的pid_1和pid_2,但重要的是一对夫妇只有一个条目,并且夫妇ID的顺序可能会有所不同。以下是表格:

tc_人员:

|   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