我有 5 个表 users、groups user_groups、documents 和 document_groups 表。我想获取属于用户及其组的所有文档
用户表
组表
id | 群组名称 |
---|---|
1 | 账户组 |
2 | IT组 |
用户组表
用户 ID | 组_id |
---|---|
1 | 1 |
2 | 1 |
3 | 2 |
John 和 martin 属于 Accounts Group,Kane 属于 IT GROUP
文件台
id | 文档名称 | 共享类型 |
---|---|---|
1 | 政策文件 | 全部 |
2 | 个人文件 | 组 |
现在第一个文档将对数据库中的所有用户可见,但第二个文档应该可供某些组访问,可能是 1 个或多个然后 1。
现在我们有最后一张桌子了
文档组
id | 组_id | 文档_id |
---|---|---|
1 | 1 | 2 |
现在第二个文档应该只能由帐户组(组 ID :1)访问,并且帐户组中只有 2 个用户 John 和 Martin
我已经尝试过下面的代码
SELECT *
from documents
lEFT Join document_groups
on document_groups.document_id = documents.id
JOIN user_groups
on document_groups.group_id = user_groups.group_id
where documents.share_type = "all" or user_groups.user_id = 1
如果我以用户 John 身份登录,我的最终输出
文档_id | 文档名称 |
---|---|
1 | 政策文件 |
2 | 个人文件 |
如果我以用户 Kane 身份登录,我的最终输出
文档_id | 文档名称 |
---|---|
1 | 政策文件 |
看起来您需要一个
EXISTS
,来检查该文档和用户是否存在匹配的 document_groups
和 user_groups
。
select d.*
from documents d
where (
d.share_type = 'all'
or exists (select 1
from document_groups dg
join user_groups ug on dg.group_id = ug.group_id
where ug.user_id = @user_id
and dg.document_id = d.id
)
);