Mysql 查询其中一个已被转置的两个表
我有以下表格,Mysql 查询其中一个已被转置的两个表,mysql,sql,subquery,having-clause,sql-null,Mysql,Sql,Subquery,Having Clause,Sql Null,我有以下表格,用户和记录。USER表只包含用户的名称和他们有权访问的组。如果用户的组为null(如BOB),则表示他们是超级用户,可以访问所有组 用户: 然后我有一个RECORDS表,其中有一个记录列表: record | field_name | value ---------------------------- 1 AGE 92 1 HEIGHT 9'2 1 __GROUP__ 1 2
用户
和记录
。USER
表只包含用户的名称和他们有权访问的组。如果用户的组为null(如BOB),则表示他们是超级用户,可以访问所有组
用户:
然后我有一个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
这不是我的设计,但这是我必须质疑的。在记录
表中,记录所属的组由字段名称列中的\uuuuuuuu组
值指示。所以我想做的是得到一个每个用户都可以访问的所有记录的列表
因此,根据用户表:
- 鲍勃有权查阅所有记录
- KEVIN和MARY只能访问具有字段名称的记录= “\uuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuu”和值=1
- JOHN只能访问具有字段名=“\uuuuuuuuuuuuuuuuuuuu”的记录 和值=2
- BOB可以访问记录1、2和3
- 凯文只能访问记录1
- 玛丽只能访问记录1
- 约翰只能访问记录2
记录
表中有一个“组”列,这会更容易,但不幸的是,这不是我的数据库,我无法更改结构
**对不起,我忘了提到一个用户可以在多个组中!例如,Mary可能在第1组和第2组中。一个选项使用
存在:
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
)
这将为您提供每个用户都有权访问的整个记录
行
如果您只需要记录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
好的,你能给我们看一下你到目前为止试过的代码吗…?很好用。非常感谢。
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