Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/fortran/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Mysql 查询其中一个已被转置的两个表_Mysql_Sql_Subquery_Having Clause_Sql Null - Fatal编程技术网

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
如果记录中缺少,这意味着只有超级用户(GROUP=null的用户)才能访问该组

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


**对不起,我忘了提到一个用户可以在多个组中!例如,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