微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

查询两个表,其中之一已转置

如何解决查询两个表,其中之一已转置

我有下表USERRECORDSUSER表仅包含用户名和他们有权访问的组。如果用户的组为空(例如BOB),则表示他们是超级用户,并且可以访问所有组。

USER:

username |  group
---------|--------
Bob      |  (null)
Kevin    |     1
John     |     2
Mary     |     1

然后我有一个RECORDS表,该表具有记录列表:

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 举报,一经查实,本站将立刻删除。