亲爱的SO社区,您好!
我已经挣扎了一段时间了,因为时间不多了,我转向你。
我有这些表:
USERS:
user_id (PK)
user_name
PROJECTS:
project_id (PK)
project_name
user_id (FK) - referring to the creator of the project
用户和项目是M:N关系,该关系在表PERMISSIONS中捕获。
PERMISSIONS:
project_id (FK)
user_id (FK)
权限行包含单个用户和单个项目的访问规则。如果表中不存在给定用户和项目的对,则该用户无法访问该项目。
我试图查询当前用户应该有权访问的所有项目,即那些他创建的项目和那些在PERMISSIONS表中与他相关联的项目,但对于每个项目,我都希望得到其创建者的user_name。我在PHP中为一个预准备语句提供当前用户ID,该语句运行良好,但我似乎无法正确查询。我已经能够
我能够获得由某个用户创建或访问的项目,但我不知道如何加入USERS,以获得我查询的项目中user_id的user_name(项目创建者的用户名)。
我想问的是:
SELECT projects.name as name, projects.project_id as project_id, projects.user_id as user_id, users.name as user_name
FROM projects JOIN permissions USING (project_id) JOIN users USING (user_id) WHERE permissions.user_id=:user_id OR
projects.user_id=:user_id ORDER BY name
3条答案
按热度按时间x6h2sr281#
有三种可能性:
1.在包含
or
的项目上使用join
,以获取创建者和具有权限的创建者。通常不建议使用包含or
的join
,因为这会导致表扫描。需要使用Distinct
Cross join projects
,并且在where
子句中有'or's。需要distinct
。1.使用
union
,一个select
用于创建者,另一个用于具有权限用户不需要Distinct
,因为union
执行distinct
在线编辑:https://onecompiler.com/mysql/3y64ukxtp
fcy6dtqo2#
查询中的问题是
user_id
字段应该同时匹配:users
和permissions
之间,以捕获允许用户处理的项目users
和projects
之间,以捕获用户创建的项目解决这个问题的一个方法是在这两个结果集之间进行
UNION
操作。为了使连接更有效,最好将过滤操作(查找特定用户)移到连接操作之前,这就是为什么我将其移到子查询中的原因(在公共表表达式cte的形式下)。您可以在示例环境here中进行尝试。
omhiaaxx3#
使用此查询:
您将获得
:user_id
创建或有权访问的所有项目的id。将其与运算符
IN
配合使用: