我正在尝试制作一个多表查询,我不太确定如何正确执行。我有用户,消息,线程和项目。
用户与Message / Thread / Project关联,作为Creator或与他们“共享”。
消息包含在一个线程中(由message.thread_id和thread.id关联),一个线程包含在一个项目中(由thread.project_id和project_id关联)。
我想创建一个查询,其中给定User.id值,它将返回用户有权访问的所有消息,以及该消息所在的线程和项目名称,作为Creator或'Shared ”。我使用表来处理'股票'。粗略图是:http://min.us/mvpqbAU
每个列中都有更多列,但为了简单起见,我将它们排除在外。
答案 0 :(得分:0)
我建议你不要继续这个设计。
您有太多的权限级别分布在各个区域。我建议你改变它,以便成员拥有组,然后组成为项目和线程的一部分。在消息级别,您正在查看在单个消息上具有该级别权限结构的管理噩梦。
答案 1 :(得分:0)
我对message,project_name和thread_name的列名做了一些假设,因为它们没有包含在图中。
/* 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