基于一些谷歌搜索和此处的问题Join vs. sub-query,似乎建议将其推荐为使用连接而不是嵌套查询,因此,我试图增强自己的工作。
这类似于文件系统,请想象下面的几张表。
user group folder
========== ========== ==========
id name id name id name
========== ========== ==========
1 Jack 1 HR 1 Staff Policies
2 James 2 Sales 2 Contracts
3 Joe 3 IT 3 Documentations
以及下面的链接表
group_user
===================
groupId userId
===================
1 1 (Jack works in HR)
1 2 (James works in HR)
3 3 (Joe works in IT)
3 1 (Jack also works in IT)
group_folder
====================
groupId folderId
====================
1 1 (HR can access Staff Policies)
1 2 (HR can access Contracts)
3 3 (IT can access Documentations)
1 3 (HR can also access Documentations)
目标是查询Jack可以访问哪个文件夹,因此我在下面使用:
SELECT f.id,
f.name
FROM folder f
WHERE f.ID IN (
SELECT gf.folderId
FROM group_folder gf
WHERE gf.groupId in (
SELECT gu.groupId
FROM group_user gu
WHERE gu.userId = 1
)
);
以上内容基本上可以为我提供所需的信息,但此类嵌套查询将来可能会导致性能问题。有谁对如何使它成为联接而不是嵌套查询有任何建议?
答案 0 :(得分:1)
基本上,您可以通过INNER JOIN将所有内容放在一起,并在查询中使用与IN
相同的约束条件,但是这里使用ON
代替。最后,您可以添加一个WHERE
子句以仅选择所需的行:
SELECT f.id, f.name
FROM folder f
INNER JOIN group_folder gf ON f.ID = gf.folderID
INNER JOIN group_user gu ON gf.groupID = gu.groupID
WHERE gu.userId = 1
答案 1 :(得分:-1)
从您的查询中,您将获得userid = 1的文件夹,实际查询需要使用group by子句,请尝试使用该子句,它会获得与查询相同的数据
SELECT f.id,f.name
FROM folder f
inner join group_folder gf on gf.folderId = f.id
inner join group_user gu on gu.groupid = gf.groupId
WHERE gu.userId = 1
group by f.id