SQL Query复杂树连接

时间:2014-04-25 14:59:56

标签: mysql sql

我有一个目录,其中包含可以包含目录的目录。目录的访问权限可以授予每个人,也可以限制为0到n个用户和/或0到n个用户组。访问权限在组的层次结构中以及从组到其用户继承。因此,用户可以访问目录,如果他被允许或(他不否认和(他的团体被允许或(他的团体不否认和(他的超级团体被允许或等等......

他们可以是1到n级别的群体,即使大部分时间,他们通常不超过3个级别。

我从架构中制作了一个sqlfiddle:http://sqlfiddle.com/#!2/81b28

我需要的是获取给定目录中可供给定用户访问的列表目录。

我到目前为止的内容如下:这将获取用户ID为'10'的目录ID'3'的内容,用户组'3'位于超级组'1'中:

select l.id, l.accessright, ll.parentlibrarydirectoryid, ulc.*, glc1.*, glc2.*
    from librarydirectory l
    inner join a_librarydirectory_librarydirectory ll on ll.childlibrarydirectoryid = l.id
    left join a_user_librarydirectory_canaccess ulc on ulc.librarydirectoryid = l.id
    left join ws_user u on u.id = ulc.userid
    left join a_group_librarydirectory_canaccess glc1 on glc1.librarydirectoryid = l.id
    left join a_group_librarydirectory_canaccess glc2 on glc2.librarydirectoryid = l.id
where 
    ll.parentlibrarydirectoryid = 3
    and (u.id = 10 or u.id is null)
    and (glc1.groupid = 3 or glc1.groupid is null)
    and (glc2.groupid = 1 or glc2.groupid is null)
    and (l.accessright = "n"
        or ((ulc.canaccess = "y") 
            or (ulc.canaccess is null and (glc1.allowedToAccess = 1 
            or (glc1.allowedToAccess is null and (glc2.allowedToAccess = 1))))));

它正在工作,但我觉得这不是很优雅,因为我需要在动态构建查询之前查询数据库以获取组的层次结构,以便添加尽可能多的a_group_librarydirectory_canaccess join和where子句。小组层次结构。

有更聪明的方法吗?

感谢您的时间

0 个答案:

没有答案
相关问题