加入3个表 - 做加入如何

时间:2010-06-15 05:08:56

标签: 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'

当我尝试左连接或右连接时,它仍会返回相同的结果。我得到的结果是:

id   | role  | resource | name

5    | 4     |        2 | Changelog 

我想要

id   | role  | resource | name

5    | 4    |   2 | Changelog 
null | null | null | Resource2 
null | null | null | Resource3

这可能吗?

4 个答案:

答案 0 :(得分:3)

查看您的查询,roleuser_permissions的一部分,WHERE `role`= '4' OR `role` IS NULL是可能存在或不存在的连接之一。如果要显示这些空记录,请考虑将where子句更改为user_resources

此外,虽然这可以通过右连接来实现,但我相信如果您从{{1}}中选择,然后在其他表上保持连接,则更易读/可理解。这来自您的问题描述声明;你想“显示所有'资源',即使他们没有连接”,这意味着你想从资源中选择,然后加入任何连接(如果存在)。

答案 1 :(得分:2)

在你要求的SQL中

WHERE `role` = '4'

并希望null中的结果rolenull不是4,因此没有这样的结果。

答案 2 :(得分:1)

首先:您的where子句将始终限制结果集。您的条件要求角色为“4” - 因此除非结果列中的结果为“4”,否则它不会显示任何结果。

第二个:来自“name”的地方 - 因为那是你想要出现的那个,你需要把那个列作为你的基表,然后LEFT JOIN另外两个表。

假设“name”来自资源,您的查询应为:

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`

答案 3 :(得分:1)

SELECT * FROM(user_permissions) 加入user_groups user_groupsid = user_permissionsrole 加入user_resources user_resourcesid = user_permissionsresource WHERE(role ='4'或role为空)

您将从此查询中获得结果