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

您将从此查询中获得结果