我有一个user
表,group
表和user_group
表为多对多。获取所有记录之间的多对多关系即使关系不存在
我很困惑,我如何能获得属于特定组的所有用户的列表,如果用户不属于当前组,我还是希望他的纪录设置为NULL组字段中列出。
我有一个user
表,group
表和user_group
表为多对多。获取所有记录之间的多对多关系即使关系不存在
我很困惑,我如何能获得属于特定组的所有用户的列表,如果用户不属于当前组,我还是希望他的纪录设置为NULL组字段中列出。
如果我理解正确的,你可以这样做:
select u.*, ug.group_id
from users u left join
user_group ug
on ug.user_id = u.user_id and ug.group_id = <the group>;
正是我想要的。非常感谢。 –
如果你不关心如何在没有用户的情况下包含组,所有无人使用的用户应该在NULL group_id的用户ID下一起收集。
SELECT g.group_id, GROUP_CONCAT(u.user_id) AS userIDs
FROM `users` AS u
LEFT JOIN `user_group` AS ug ON u.user_id = ug.user_id
LEFT JOIN `group` AS g ON ug.group_id = g.group_id
GROUP BY g.group_id
;
如果我把你想说的,应该为你做的伎俩什么。
--Creating data for users
;with users as (
select 1 as ID, 'Jonh' as name union all
select 2 as ID, 'Suzan' as name union all
select 3 as ID, 'Wolv' as name union all
select 4 as ID, 'Rine' as name union all
select 5 as ID, 'Someone' as name
)
Select *
into #users
From users
--Creating data for groups
;with groups as (
select 1 as ID, 'Admin' as descri union all
select 2 as ID, 'Users' as descri union all
select 3 as ID, 'NoOne' as descri
)
Select *
into #groups
From groups
--Creating data for N x N relation
;with users_group as (
select 1 as users, 1 as groups union all
select 2 as users, 1 as groups union all
select 1 as users, 2 as groups
)
Select *
into #users_group
From users_group
--Declare @groupID int = null
Declare @groupID int = 1
select #users.id
, #users.name
, #groups.descri
from #groups
Inner Join #users_group as link
on link.groups = #groups.ID
and (#groups.id = @groupID or @groupID is null) --Filter here
Full outer join #users --Full outer join to always bring users
on #users.Id = link.users
drop table #users_group
drop table #groups
drop table #users
样本数据,预期输出和您的尝试将是有帮助的。 –
听起来像它需要被类似于一个完整的外连接处理,因为它是一种聚合;所以你需要分别查询“左”(组和他们的用户)和“右”(无分组用户)一半,并联合他们。 _This假设你想在你的结果中包含无用户组。[ – Uueerdo
]脱离主题,但NBA的专员知道SQL。 – msagala25