【问题标题】:Query two tables where one of them has been transposed查询其中一张已转置的两张表
【发布时间】:2020-09-16 18:00:42
【问题描述】:

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

用户:

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。
  • Kevin 只能访问记录 1
  • Mary 只能访问记录 1
  • John 只能访问记录 2

如果记录中缺少 GROUP,则意味着只有超级用户(group = null 的用户)可以访问它。

我知道如果在 RECORDS 表中它会有一个“GROUP”列,这会更容易,但不幸的是,这不是我的数据库,我无法更改结构。

**抱歉,我忘了提到一个用户可以在多个组中!例如,玛丽可能属于第 1 组和第 2 组。

【问题讨论】:

  • 好吧,你能告诉我们你到目前为止尝试过的代码吗?

标签: mysql sql subquery having-clause sql-null


【解决方案1】:

一个选项使用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

【讨论】:

  • 完美运行。谢谢!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-12-08
  • 2021-11-22
  • 2019-11-15
相关资源
最近更新 更多