Sql 连接查询的问题
我正在web应用程序中实现home brew ACL系统,这给我带来了困难。我相信这件事很琐碎,只是我无法理解 我在一对多关系中有3个表: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
资源
,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