首页 > 解决方案 > 如何在 PostgreSQL 中找到传递相关(1 度分离)的 ID?

问题描述

第一次在这里发问题,找不到任何其他方式的答案。

我有一张乐队桌

bands
id | name

我有一张音乐桌

musicians
id | first_name | last_name

我创建了第三个表,通过外键链接它们

band_membership
band_id | musician_id

我在bands桌子上放了几支乐队和musicians几位音乐家。

然后我将音乐家John Doe(ID 1)与乐队Foo(ID 1)和Bar(ID 2)联系起来

然后我将音乐家Jane Doe(ID 2)与乐队Foo(ID 1)和Rab(ID 3)联系起来

所以这些音乐家共享一个乐队,但也分别在其他乐队演奏。

问题是:如何选择乐队的所有成员Foo并遍历Foos 音乐家并选择与其成员相关/关联的所有乐队名称Foo?在这种情况下,我希望“输入”波段为Foo,SELECT 结果为

1 | Bar
2 | Rab

Foo因为这些是通过乐队成员的其他副项目/乐队直接(1度分离)关联的两个乐队

我知道我可以Foo通过以下查询选择 s 成员(Jane 和 John)的所有 ID

SELECT m.id FROM musicians AS m
INNER JOIN band_membership AS bm ON m.id = bm.musician_id
INNER JOIN bands AS b ON bm.band_id = (SELECT id FROM bands WHERE name = 'Foo')
GROUP BY m.id

我也知道我可以John Doe通过以下查询找到所有乐队的成员

SELECT b.name FROM bands AS b
INNER JOIN band_membership AS bm ON b.id = bm.band_id
INNER JOIN musicians as m ON bm.musician_id = 1
GROUP BY b.name

但是对于我的生活,我找不到将这些结合起来的方法。

第一个查询将返回

1 | 1
2 | 2

这是 John 和 Jane 的 ID,但我如何将它们“插入”到第二个查询中,1目前是硬编码的。

谢谢您的帮助!

标签: sqlpostgresql

解决方案


您可以只使用多个连接:

select distinct b2.name
from bands b join
     band_membership bm
     on bm.band_id = b.id join
     band_membership bm2
     on bm2.musician_id = bm.musician_id join
     bands b2
     on bm2.band_id = b2.id
where b.name = 'Foo'

推荐阅读