这是我当前的查询 - 它没有获得所需的结果。我希望它显示所有“资源”,即使它们没有连接。
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
这可能吗?
答案 0 :(得分:3)
查看您的查询,role
是user_permissions
的一部分,WHERE `role`= '4' OR `role` IS NULL
是可能存在或不存在的连接之一。如果要显示这些空记录,请考虑将where子句更改为user_resources
。
此外,虽然这可以通过右连接来实现,但我相信如果您从{{1}}中选择,然后在其他表上保持连接,则更易读/可理解。这来自您的问题描述声明;你想“显示所有'资源',即使他们没有连接”,这意味着你想从资源中选择,然后加入任何连接(如果存在)。
答案 1 :(得分:2)
在你要求的SQL中
WHERE `role` = '4'
并希望null
中的结果role
? null
不是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_groups
。id
= user_permissions
。role
加入user_resources
user_resources
。id
= user_permissions
。resource
WHERE(role
='4'或role
为空)
您将从此查询中获得结果