sql - 如何在 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
并遍历Foo
s 音乐家并选择与其成员相关/关联的所有乐队名称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
目前是硬编码的。
谢谢您的帮助!
解决方案
您可以只使用多个连接:
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'
推荐阅读
- kubernetes - 什么是使用 kubectl 的简单构建和部署过程?
- amazon-web-services - 在 SQS lambda 环境中扇出的推荐方法是什么?
- pari - 从 pari/gp 调用外部函数
- java - 从 arrayList 检查 int 值
- recaptcha - 为桌面应用程序(机器人)重用站点 recaptcha 密钥(绕过它)
- c++ - 模板和通用参考
- python-3.x - 如何在 ipywidget out 小部件中显示 matplotlib 饼图?我正在使用 Jupyter Notebook,目前没有显示任何内容
- r - 比较两列的条件
- excel - 当我在列中提取具有相同名称的数据并将它们放入不同的工作表时,如何解决“程序无响应错误”?
- sql - 如何解决错误 180-322:语句无效或在 SAS 中使用顺序不正确而无需重新启动?