Sql 连接3个表-执行连接如何
这是我当前的查询-它没有得到所需的结果。我希望它显示所有的资源,即使他们没有连接Sql 连接3个表-执行连接如何,sql,mysql,Sql,Mysql,这是我当前的查询-它没有得到所需的结果。我希望它显示所有的资源,即使他们没有连接 SELECT * FROM (`user_permissions`) JOIN `user_groups` ON `user_groups`.`id` = `user_permissions`.`role` JOIN `user_resources` ON `user_resources`.`id` = `user_permissions`.`resource` WHERE `role` = '4' 当我尝试左连
SELECT *
FROM (`user_permissions`)
JOIN `user_groups` ON `user_groups`.`id` = `user_permissions`.`role`
JOIN `user_resources` ON `user_resources`.`id` = `user_permissions`.`resource`
WHERE `role` = '4'
当我尝试左连接或右连接时,它仍然返回相同的结果。我得到的结果是:
id | role | resource | name
5 | 4 | 2 | Changelog
我想要
id | role | resource | name
5 | 4 | 2 | Changelog
null | null | null | Resource2
null | null | null | Resource3
这可能吗?查看您的查询,角色是用户权限的一部分,这是可能存在或不存在的连接之一。如果您想同时显示这些空记录,请考虑将WHERE子句更改为“角色”=“4”或“角色”,NU/P>
另外,虽然这可以通过右连接来实现,但我认为如果您选择从用户资源中选择,然后在其他表上选择左连接,则更易于阅读/理解。这源于您的问题描述陈述;即使没有连接,您也要显示所有“资源”,这意味着您要从资源中选择,然后加入任何连接(如果存在)。在您请求的sql中
WHERE `role` = '4'
并且希望结果在角色中为null?null不是4,因此没有这样的结果。首先:where子句将始终限制结果集。您有一个条件要求角色为4,因此它不会显示任何结果,除非结果在“角色”列中有4
第二:名称从何而来-因为这是您希望显示的名称,所以需要将该列作为基表的表左键联接其他两个表
假设名称来自资源,则查询应为:
SELECT *
FROM `user_resources`
LEFT JOIN `user_permissions` ON `user_permissions`.`resource` = `user_resources`.`id`
LEFT JOIN `user_groups` ON `user_groups`.`id` = `user_permissions`.`role`
挑选*
从用户权限
在用户组上加入用户组。id=用户权限。角色
在user\u resources.id=user\u permissions.resource上加入user\u资源
其中role='4'或role为null
您将从此查询中获得结果