多表mysql查询

多表mysql查询,mysql,Mysql,我正在尝试进行一个多表查询,但我不太确定如何正确执行该查询。我有用户、消息、线程和项目 用户以创建者或与他们“共享”的身份与消息/线程/项目关联 消息包含在由Message.Thread\u id和Thread.id关联的线程中,线程包含在由Thread.Project\u id和Project\u id关联的项目中 我想创建一个查询,其中给定User.id值,它将返回用户有权访问的所有消息,以及该消息所属的线程和项目名称,无论是作为创建者还是“共享”。我用一张桌子来处理“股份”。简图如下: 每

我正在尝试进行一个多表查询,但我不太确定如何正确执行该查询。我有用户、消息、线程和项目

用户以创建者或与他们“共享”的身份与消息/线程/项目关联

消息包含在由Message.Thread\u id和Thread.id关联的线程中,线程包含在由Thread.Project\u id和Project\u id关联的项目中

我想创建一个查询,其中给定User.id值,它将返回用户有权访问的所有消息,以及该消息所属的线程和项目名称,无论是作为创建者还是“共享”。我用一张桌子来处理“股份”。简图如下:


每个栏中都有更多的栏,但为了简单起见,我把它们省略了。

我敦促您不要继续进行此设计


您有太多的权限级别分布在各个区域。我建议您对其进行修改,以使成员具有组,而组又可以是项目和线程的一部分。在消息级别,您看到的是一个管理噩梦,在单个消息上具有该级别的权限结构。

我对消息、项目名称和线程名称的列名做了一些假设,因为它们不包括在图表中

/* Get messages where user is creator */
select u.name, m.message, p.project_name, t.thread_name
    from user u
        inner join message m
            on u.id = m.owner_user_id
        inner join thread t
            on m.group_id = t.id
        inner join project p
            on t.project_id = p.id
    where u.id = @YourUserID
union
/* Get messages where user has shared access */
select u.name, m.message, p.project_name, t.thread_name
    from user u
        inner join message_share ms
            on u.id = ms.user_id
        inner join message m
            on ms.message_id = m.id
                and m.owner_user_id <> @YourUserID
        inner join thread t
            on m.group_id = t.id
        inner join project p
            on t.project_id = p.id
    where u.id = @YourUserID

一个澄清问题:由于用户可以与任何级别的项目、线程、消息的实体相关联,用户是否可以访问他们拥有/共享的实体的所有子级?例如,拥有ProjectX的用户P是否有权访问与ProjectX关联但由用户Q拥有的线程?这是正确的。所有者/创建者继承对项目/组中所有内容的访问权,但不会成为子项的所有者/创建者。其思想是,可以稍后将某人分配给一条消息,而不是整个线程负责响应。我假设更改所有者,或者创建一个指定的列,只需稍加更改即可完成相同的查询。但是,是的,颗粒层面的复杂性让我感到困惑。这是有效的。将不得不向我的数据库中添加更多额外的示例数据,以查看限制,但到目前为止仍在工作。谢谢你,乔