如何解决查询两个表,其中之一已转置
我有下表USER
和RECORDS
。 USER
表仅包含用户名和他们有权访问的组。如果用户的组为空(例如BOB),则表示他们是超级用户,并且可以访问所有组。
USER:
username | group
---------|--------
Bob | (null)
Kevin | 1
John | 2
Mary | 1
record | field_name | value
----------------------------
1 AGE 92
1 HEIGHT 9'2
1 __GROUP__ 1
2 AGE 11
2 HEIGHT 1'1
2 __GROUP__ 2
3 AGE 68
3 HEIGHT 6'8
这不是我的设计,而是我必须查询的内容。在RECORDS
表中,记录所属的组由field_name列中的__GROUP__
值指示。因此,我想做的就是获取每个用户有权访问的所有记录的列表。
因此,根据用户表:
-
BOB可以访问所有记录
-
KEVIN和MARY仅可访问具有field_name = “ __ GROUP __”且值= 1
-
JOHN仅可访问具有field_name ='__ GROUP __'的记录 且值= 2
这是
- BOB有权访问记录1、2和3。
- 凯文只能访问记录1
- 玛丽只能访问记录1
- John仅有权访问记录2
如果记录中缺少 GROUP ,则意味着只有超级用户(组= null的用户)才能访问它。
我知道如果在RECORDS
表中有一个“ GROUP”列,这会更容易,但是不幸的是,这不是我的数据库,因此我无法更改结构。
**对不起,我忘了提到一个用户可能有多个群组!例如,玛丽可能在第1和第2组中。
解决方法
一个选项使用exists
:
select u.*,r.*
from user u
cross join records r
where u.grp is null or exists (
select 1
from records r1
where
r1.ecord = r.record
and r1.field_name = '__GROUP__'
and r1.value = u.grp
)
这将为您提供每个用户有权访问的整个records
行。
如果只需要记录ID的列表,则可以改用聚合:
select u.userame,r.record
from users u
cross join records r
group by u.userame,u.grp,r.record
having
u.grp is null
or max(r.field_name = '__GROUP__' and r.value = u.grp) = 1
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。