联合表而不是相交

时间:2013-12-01 15:10:43

标签: mysql sql join

我有以下结构

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

1 个答案:

答案 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_accessprofile_id,而不是user_id字段。