在 SQL 尝试 return 所有属于同一组成员的用户作为特定用户

in SQL Trying to return all users who are members of the same groups as a specific user

这个查询让我有点转过身来。在 Postgresql (Express/Knex/Objection) 数据库中,我有三个 table,用户、组和关联的 table 成员资格 s.t。用户 have_many 组通过成员资格。

对于特定用户组,我想 return 所有其他拥有这些组成员资格的用户。

回答下面的问题,给定一个用户,我想 return 属于任何组的所有其他不同用户,其中也包括第一个用户。

我认为加入的两边都有用户,这让我感到困惑。我想人们已经多次解决了这个问题,但我没有在网上找到任何例子。每个请求,包括 table 架构:

用户:

群组:

会员资格:

好的,评论现在更有意义了,我已经相应地编辑了解决方案。

select 
    distinct u.user.id

from users u
join memberships m on u.id = m.users_id

where m.groups_id in 

    (//this is the subquery to get the groups of the initial user)
    select 
        m.groups_id

    from memberships m

    where m.users_id = [user_1] //this is where you set your initial user
    ) subQuery

有几种方法可以做到这一点,但这是传统的 SQL 风格,并根据您的评论进行了细分。

这将 return 只是一个不同的用户列表 - 根据需要在顶部添加额外的列 select 以获取更多详细信息。

在您的异议 User 模型中,定义 用户和组之间的关系 :

  static relationMappings = {
    groups: {
      relation: Model.ManyToManyRelation, // An user has many groups
      modelClass: Group,
      join: {
        from: 'users.id',
        through: {
          from: 'memberhips.users_id',
          to: 'memberhips.groups_id'
        },
        to: 'groups.id'
      }
    }
  }

然后,在您的 Objetion Group 模型中,定义 组和用户之间的关系 :

  static relationMappings = {
    users: {
      relation: Model.ManyToManyRelation, // A group has many users
      modelClass: User,
      join: {
        from: 'groups.id',
        through: {
          from: 'memberhips.groups_id',
          to: 'memberhips.users_id'
        },
        to: 'users.id'
      }
    }
  }

然后使用预先加载来加载关系:

User.query().eager('groups.[users]').findById(userId)

查询应该 return 像这样的结构(某些属性如 address 被忽略):

User {
  id: 3,
  name: 'name',
  description: 'description',
  groups: [ // User 3 has two groups: 1 and 2
    {
        id: 1,
        name: 'name1',
        users: [ // There are two member of group, 3 and 6
            {
                id: 3,
                name: 'name',
                description: 'description'
            },
            {
                id: 6,
                name: 'other',
                description: 'other'
            }
        ]
    },
    {
        id: 2,
        name: 'name2',
        users: [
            {
                id: 3,
                name: 'name',
                description: 'description'
            },
            {
                id: 7,
                name: 'another',
                description: 'another'
            }
        ]
    },
  ]
}