php - MySQL 连接表与过滤器

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

在示例数据中,您可以看到 id 为 1 的权限。在 user_group_properties 表中有两个 permission_id 为 1 的条目。在第一个条目中,user_id 为 null 而 group_id 不是,在第二个条目中,group_id 为 null 并且user_id 不是。 如果我现在正在执行连接查询,MySQL 服务器将给我第一行,即用户 ID 为空的行,但如果存在这样的行,我需要用户 ID 不为空的行。如果现在用户 ID 为 null 的行存在,我需要该组的行。

我希望你能帮助我。

非常感谢!

最佳答案

如果我没理解错的话,您想优先访问 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}

关于php - MySQL 连接表与过滤器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38908661/

相关文章:

mysql - 带条件的 SUM 行的 SQL 语句

php - Codeigniter 分页

php - 限制对php文件的访问

php - 修复特定的 CSS 定位问题

mysql - DELETE FROM `table` AS `alias` ... WHERE `alias` .`column` ... 为什么语法错误?

mysql - 组内的 MAX 聚合

mysql - 如何从mysql函数中的字母数字文本中修剪前导零

mysql - 如何创建 MySQL 分层递归查询?

php - 我究竟如何在 Symfony2/Doctrine 中创建自定义 EntityManager?

mysql - 保存查询结果以在 IN 比较中使用