【问题标题】:MySQL Joining Table with FilterMySQL 使用过滤器连接表
【发布时间】:2016-08-12 01:54:17
【问题描述】:

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

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 表中都有一个条目。 现在我想从权限表开始,想加入 user_group_properties 表。给出了用户 ID 和组 ID。 如果用户在user_group_properties-table中有自己的行(至少有一个条目“where user_id = {user_id}”,那么我要获取这一行,否则我要获取组的行。

在示例数据中,您可以看到 ID 为 1 的权限。在 user_group_properties 表中有两个权限 ID 为 1 的条目。在第一个条目中,user_id 为 null 而 group_id 不是,在第二个条目中,group_id 为 null 并且user_id 不是。 如果我现在正在执行 Join-Query,MySQL-Server 会给我第一行,即用户 ID 为空的行,但如果存在这样的行,我需要用户 ID 不为空的行。如果现在存在用户 ID 为空的行,我需要该组的行。

我希望你能帮助我。

非常感谢!

【问题讨论】:

  • 您能否编辑您的问题并提供示例数据和所需的结果?

标签: php mysql sql database join


【解决方案1】:

如果我理解正确,您希望优先考虑来自 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}

【讨论】:

  • 有没有办法通过权限表获取这些信息?我想以此为基础,因为我也需要权限表的信息。
  • @JanW 。 . .您可以在权限表中加入两个子查询。
【解决方案2】:
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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2020-01-18
    • 1970-01-01
    • 2021-06-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多