在 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'
}
]
},
]
}
这个查询让我有点转过身来。在 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'
}
]
},
]
}