用join替换嵌套查询

时间:2019-04-25 06:50:41

标签: mysql

基于一些谷歌搜索和此处的问题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
                                       )
                  );

以上内容基本上可以为我提供所需的信息,但此类嵌套查询将来可能会导致性能问题。有谁对如何使它成为联接而不是嵌套查询有任何建议?

2 个答案:

答案 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