我有以下结构
user
id | name
----------
1 | Foo
2 | Bar
profile
id | name | user_id
--------------------------
1 | Profile 1 | 1
2 | Profile 2 | 2
profile_access
id | user_id | profile_id
--------------------------
1 | 2 | 1
期待查询的结果
id | name | user_id
-----------------------------------
1 | Profile 1 | 1
2 | Profile 2 | 2
1 | Profile 1 | 2
但我不知道如何“合并”这些表格。我试过了:
SELECT profile.*
FROM profile profile
LEFT JOIN profile_access AS profile_access
ON (
profile_access.profile_id = profile.id
)
返回
id | name | user_id
-----------------------------------
1 | Profile 1 | 1
2 | Profile 2 | 2
和
SELECT profile.*
FROM profile profile
RIGHT JOIN profile_access AS profile_access
ON (
profile_access.profile_id = profile.id
)
结果
id | name | user_id
-----------------------------------
2 | Profile 1 | 2
执行此查询的正确方法是什么?我是否使用连接错误或期望这些表格产生不可能的结果?
修改 预期结果应为:
id | name | user_id
-----------------------------------
1 | Profile 1 | 1
2 | Profile 2 | 2
1 | Profile 1 | 2
答案 0 :(得分:2)
目前还不清楚您想要的确切逻辑是什么,但以下内容会返回问题中的结果:
select p.id, p.name, p.user_id
from profile p
union all
select p.id, p.name, pa.user_id
from profile p join
profile_access pa
on pa.profile_id = p.id;
编辑:
返回:
id | name | user_id
-----------------------------------
1 | Profile 1 | 1
2 | Profile 2 | 2
1 | Profile 1 | 2
请注意,最后一行的ID为1
,而不是2
(与原始预期答案一样)。这对我来说是明智的,因为id = 1
仅与表格中的个人资料名称= 'Profile 1'
相关联。但是,要获得实际输出:
select p.id, p.name, p.user_id
from profile p
union all
select pa.profile_id, p.name, pa.user_id
from profile p join
profile_access pa
on pa.user_id = p.user_id;
我使用第一个解决方案的原因是因为示例查询profile
字段上的所有profile_access
和profile_id
,而不是user_id
字段。