从引用/联接表中获取所有很多:许多关系

问题描述 投票:1回答:1

我在许多很多情况下难以查询可能的关系。感谢任何帮助!

我展示我的模式:

“

知道如何使用此架构进行查询的是:

  • 给定用户所属的所有频段。
  • 属于给定Band的所有用户。

我正在[[尝试要做的是:

    获取给定用户所属的
  • all
乐队中的all乐队成员。
    也就是说,我在5个乐队中,我想知道我的队友中的[[all
是谁。
  • 我的第一个问题是:

    这种查询有名称吗?我对加入的关系比对加入的[[what

    更感兴趣(只是说让我想将整个系统放入Graph DB:/)?我想学习适当的术语,以帮助Google在以后解决问题。
    • 一般来说,这在RDBMS中是一个可怕的想法吗?我觉得这应该是一个普通的用例,但是我想知道我是否完全解决了这个错误。
  • 回顾:
  • 我正在查询上面的模式,期望的输出是作为给定用户共享波段的波段成员的每个用户一行。
  • 感谢您提供任何/所有帮助!让我知道是否需要提供其他信息!

    sql postgresql many-to-many postgresql-9.6
    1个回答
    0
    投票
    您可能会丢下band_members.id,因为这两个外键还组成了一个复合主键(并且主键实际上可以用这种方式定义,因为通常用户不能两次成为同一波段的成员。唯一的例外是,如果一个用户在同一波段中可能有多个角色)。

    解决方案

    表面上,这听起来很容易-我们可以看到表之间的关系,通常情况下,它们之间只是使用INNER JOIN。有三个表,因此将是两个联接。

    但是,我们必须首先正确地概念化问题。我们遇到的问题是用户和乐队成员之间的联接(用户ID)实际上用于两件事:

    谁在哪个乐队中

    按用户筛选

      因此,我们需要引入一个具有多种用途的表:
    • SELECT Users.first_name, Users.last_name FROM Users INNER JOIN Band_Members Band_Members1 ON (Band_Members1.user_id = Users.Id) INNER JOIN Band_Members Band_Members2 ON (Band_Members1.band_id = Band_Members2.band_id) WHERE Band_Members2.user_id = 1
    • [您可以在这里看到我已经加入Band_Members两次,而这样做的时候,必须给它们起不同的别名,以便可以分别引用它们。第一个实例在Users表和Bridge表之间进行了明显的联接,第二个实例在“乐队中的用户”和“我所在的乐队”之间进行了链接。

      当然,此解决方案要求您知道您的用户ID。如果您想进行类似的查询但要根据您的姓名进行过滤,则您必须加入User表的另一个(重新别名的)副本,以便您可以区分两个不同的目的:乐队”和“您的用户”。

    © www.soinside.com 2019 - 2024. All rights reserved.