MySQL加入表与过滤器

时间:2016-08-12 01:54:18

标签: php mysql sql database join

我正在编写用户组系统。这是我的数据库结构:

users(id username group_id)
-------- -------- --------
1        gesting  1

groups(id title)
--------- -----
1         Admin

permissions(id value)
-------------- --------------
1              testpermission

user_group_properties
group_id user_id permission_id data
-------- ------- ------------- -------------------------
1        NULL    1             some further information
NULL     1       1             some further information

每个用户都在一个组中,每个组在user_group_properties表中都有一个条目。 现在我想从permissions-table开始,并希望加入user_group_properties-table。给出了user-id和group-id。 如果用户在user_group_properties-table中有自己的行(至少有一个条目“where user_id = {user_id}”,那么我想得到这一行,否则我想得到该组的行。

在示例数据中,您可以看到id为1的权限。在user_group_properties表中有两个条目,其中包含permission_id 1.在第一个条目中,user_id为null,group_id为not,在第二个条目中group_id为null, user_id没有。 如果我现在正在进行Join-Query,那么MySQL-Server会给我第一行,即user-id为null的行,但如果存在这样的行,我需要user-id不为null的行。如果now user存在于user-id为null的位置,则需要该组的行。

我希望你能帮助我。

非常感谢!

2 个答案:

答案 0 :(得分:0)

如果我理解正确,您希望优先考虑来自user_group_properties的访问权限。 。 。首先,如果用户存在,则为任何组。这是一种方法:

select ugp.*
from user_group_properties ugp
where ugp.user_id = {user_id}
union all
select ugp.*
from user_group_properties ugp join
     users u
     on ugp.group_id = u.group_id and u.id = {user_id}
where not exists (select 1 from user_group_properties ugp2 where ugp2.user_id = {user_id}

答案 1 :(得分:0)

SELECT *
FROM   user_group_properties
WHERE  permission_id = 1
AND    (user_id = 1 OR user_id is NULL)
ORDER  BY user_id DESC
LIMIT  1