2017-10-09 51 views
1

我有一个user表,group表和user_group表为多对多。获取所有记录之间的多对多关系即使关系不存在

我很困惑,我如何能获得属于特定组的所有用户的列表,如果用户不属于当前组,我还是希望他的纪录设置为NULL组字段中列出。

+2

样本数据,预期输出和您的尝试将是有帮助的。 –

+1

听起来像它需要被类似于一个完整的外连接处理,因为它是一种聚合;所以你需要分别查询“左”(组和他们的用户)和“右”(无分组用户)一半,并联合他们。 _This假设你想在你的结果中包含无用户组。[ – Uueerdo

+0

]脱离主题,但NBA的专员知道SQL。 – msagala25

回答

3

如果我理解正确的,你可以这样做:

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>; 
+0

正是我想要的。非常感谢。 –

0

如果你不关心如何在没有用户的情况下包含组,所有无人使用的用户应该在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 
; 
0

如果我把你想说的,应该为你做的伎俩什么。

--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