查询两张表,其中一张被转置
Query two tables where one of them has been transposed
我有以下 table、USER
和 RECORDS
。 USER
table 只包含用户的名称和他们有权访问的组。如果用户的组为 null(例如 BOB),则意味着他们是超级用户并且可以访问所有组。
用户:
username | group
---------|--------
Bob | (null)
Kevin | 1
John | 2
Mary | 1
然后我有一个 RECORDS
table 有一个记录列表:
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
table中,记录所属的组由field_name列中的__GROUP__
值表示。所以我想做的是获取每个用户有权访问的所有记录的列表。
所以基于用户table:
BOB 可以访问所有记录
KEVIN 和 MARY 只能访问具有 field_name =
'__ GROUP __' 和值 = 1
JOHN 只能访问具有 field_name = '__ GROUP __' 的记录
和值 = 2
这意味着
- BOB 可以访问记录 1、2 和 3。
- 凯文只能访问记录 1
- Mary 只能访问记录 1
- John 只能访问记录 2
如果记录中缺少 GROUP,这意味着只有超级用户(group = null 的用户)才能访问它。
我知道如果在 RECORDS
table 中有一个“GROUP”列,这会更容易,但不幸的是,这不是我的数据库,我无法更改结构.
**抱歉,我忘了说一个用户可以在多个组中!例如,Mary 可能属于第 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
我有以下 table、USER
和 RECORDS
。 USER
table 只包含用户的名称和他们有权访问的组。如果用户的组为 null(例如 BOB),则意味着他们是超级用户并且可以访问所有组。
用户:
username | group
---------|--------
Bob | (null)
Kevin | 1
John | 2
Mary | 1
然后我有一个 RECORDS
table 有一个记录列表:
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
table中,记录所属的组由field_name列中的__GROUP__
值表示。所以我想做的是获取每个用户有权访问的所有记录的列表。
所以基于用户table:
BOB 可以访问所有记录
KEVIN 和 MARY 只能访问具有 field_name = '__ GROUP __' 和值 = 1
JOHN 只能访问具有 field_name = '__ GROUP __' 的记录 和值 = 2
这意味着
- BOB 可以访问记录 1、2 和 3。
- 凯文只能访问记录 1
- Mary 只能访问记录 1
- John 只能访问记录 2
如果记录中缺少 GROUP,这意味着只有超级用户(group = null 的用户)才能访问它。
我知道如果在 RECORDS
table 中有一个“GROUP”列,这会更容易,但不幸的是,这不是我的数据库,我无法更改结构.
**抱歉,我忘了说一个用户可以在多个组中!例如,Mary 可能属于第 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