Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/58.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
Sql 连接查询的问题_Sql_Mysql_Postgresql - Fatal编程技术网

Sql 连接查询的问题

Sql 连接查询的问题,sql,mysql,postgresql,Sql,Mysql,Postgresql,我正在web应用程序中实现home brew ACL系统,这给我带来了困难。我相信这件事很琐碎,只是我无法理解 我在一对多关系中有3个表: 资源,perms\u组,perms\u用户 其中,perms_组是一个关键表,而perms_用户允许我根据需要微调每个用户的访问权限(它加起来等于perms_用户或只是简单地覆盖它,两个表将权限作为布尔值存储在单独的列中) 我正在尝试从资源中获取内容,并在单个查询中获取权限: SELECT * FROM resource LEFT OUTER JOIN pe

我正在web应用程序中实现home brew ACL系统,这给我带来了困难。我相信这件事很琐碎,只是我无法理解

我在一对多关系中有3个表:
资源
perms\u组
perms\u用户
其中,
perms_组
是一个关键表,而
perms_用户
允许我根据需要微调每个用户的访问权限(它加起来等于
perms_用户
或只是简单地覆盖它,两个表将权限作为布尔值存储在单独的列中)

我正在尝试从资源中获取内容,并在单个查询中获取权限:

SELECT *
FROM resource
LEFT OUTER JOIN perms_groups ON resource.id = perms_group.res_id
LEFT OUTER JOIN perms_users ON resource.id = perms_users.res_id
WHERE resource.id = 1
    AND perms_group.group_id = 2
    AND perms_users.user_id = 3
现在的问题是,很少设置用户的精细权限,在这种情况下,上面的查询将返回0行。我想告诉大家的是,如果设置了第2组和第3用户的烫发,请让我重新烫发。基本上,我缺少
和_如果_存在
操作符;)。我可以很容易地将它分为两个查询,但由于它将在每次页面刷新时运行,因此我需要尽可能精简它。目前我正在使用MySQL,但希望稍后切换到PostgreSQL,这样理想的解决方案将是独立于数据库的。有什么想法吗

谢谢


事实上,如果在不知道是否会有数据的情况下在表中写入条件,则左外部联接是无用的。

如果您联接(左外部联接),则可以使用
大小写
合并
来实现所需的功能将您的权限移动到一行。

您可以尝试将WHERE子句移动到用户和组的联接中

SELECT *
FROM   resource
       LEFT OUTER JOIN perms_groups ON resource.id = perms_group.res_id AND perms_group.group_id = 2
       LEFT OUTER JOIN perms_users ON resource.id = perms_users.res_id AND perms_users.user_id = 3
WHERE  resource.id = 1    

如果您的用户权限覆盖组权限,请使用以下选项:

SELECT  permission
FROM    resource
JOIN    perms_users
ON      perms_users.res_id = resource.id
WHERE   resource.id = 1
        AND user_id = 3
UNION ALL
SELECT  permission
FROM    resource
LEFT JOIN
        perms_groups
ON      perms_group.res_id = resource.id
        AND group_id = 2
WHERE   resource.id = 1
LIMIT 1

这将更加有效,因为如果在
perms\u用户中找到记录,此查询甚至不会查看
perms\u组
,要更好地了解外部联接,请阅读以下内容:

SELECT  permission
FROM    resource
JOIN    perms_users
ON      perms_users.res_id = resource.id
WHERE   resource.id = 1
        AND user_id = 3
UNION ALL
SELECT  permission
FROM    resource
LEFT JOIN
        perms_groups
ON      perms_group.res_id = resource.id
        AND group_id = 2
WHERE   resource.id = 1
LIMIT 1