我试图做一个多表的查询,我不太清楚如何做好。我有用户、消息、线程和项目。
用户与Message/Thread/Project关联为Creator或与他们“共享”。
消息包含在线程中(由message.thread_id和thread.id关联),线程包含在项目中(由thread.project_id和project_id关联)。
我想要创建一个查询,其中给定一个User.id值,它将返回用户可以访问的所有消息,以及消息所在的线程和项目名称,无论是Creator还是“Shared”。我用一个表格来处理‘股票’。粗略的图表是:http://min.us/mvpqbAU
每个列中都有更多的列,但为了简单起见,我忽略了它们。
发布于 2011-02-23 03:37:48
看来您需要使用“联接”语法。类似于:
SELECT
u.name,
u.id,
m.id,
t.id,
p.id,
FROM User u
LEFT JOIN Message m ON m.owner_user_id = u.id
LEFT JOIN Thread t ON t.owner_user_id = u.id
LEFT JOIN Project p ON p.owner_user_id = u.id
WHERE u.id = 12345当然,这将必须被修改,以包括您实际想要返回的字段以及您可能需要的任何排序和排序.但这应该能让你开始。祝好运!
发布于 2011-02-23 15:33:03
我可能会用一个友联市来接近这个。
对每种类型的消息(消息、项目、线程)执行查询:
SELECT user.name, type, type.info FROM (
( SELECT user.name, 'project', project.* FROM ... // PROJECT OWNER AND SHARED QUERY // )
UNION
( SELECT user.name, 'thread', thread.* FROM ... // THREAD OWNER AND SHARED QUERY // )
UNION
( SELECT user.name, 'message', message.* FROM ... // MESSAGE OWNER AND SHARED QUERY // )
) combined其中type是信息的来源,而type.info包含特定类型的字段。只需确保您的project.*、thread.*、message.*包含相同数量的字段,否则UNION会发出抱怨。
**免责声明,没有经过测试,只是一个可行的理论。
发布于 2011-02-25 14:14:07
基本查询应该如下所示,用user_id替换12345。您可以根据需要添加其他字段。
select msg.id message_id
from message msg
inner join (
select thr.id thread_id
from thread thr
inner join (
select id as project_id from project where owner_user_id = 12345
union select project_id from project_share where user_id = 12345
) prj on prj.project_id = a.project_id
union select thread_id from thread_share where user_id = 12345
) thr on thr.thread_id = msg.group_id
union select message_id from message_share where user_id = 12345警告:未测试。
https://dba.stackexchange.com/questions/1394
复制相似问题