2012-05-30 42 views
3

我目前正试图让我的头绕着我想要做的MySQL查询。很可能是因为我没有睡觉,所以我没有清楚地思考,但是我有一段时间以来一直困扰着我。在跨多个表建立连接查询时遇到困难

我想建立一个查询来返回我的网站上的用户有权访问的所有附件。每个附件都有一个与其关联的owner_id,并且还有一些组通过groups_attachments表链接到attachments表。

所以我的表是:

+--------------------+ 
| attachments  | 
| groups    | 
| groups_attachments | 
| users    | 
| users_attachments | 
| users_groups  | 
+--------------------+ 

附件,组和用户都有自己的ID和链接表保存每个表的ID被链接。

我想选择从附件的所有字段如果任一attachment.owner_id匹配users.user_id或者如果users.user_id处于users_attachments(当所有者授予许可特异性)或者如果users.user_id是在users_groups用于经由相关的附件的组users_attachments

回答

1

不要试图用一个神奇的查询做这一切 - 用一系列查询联合在一起:目标用户ID

select * 
from attachments 
where owner_id = $userid 
union 
select a.* 
from users_attachments ua 
join attachments a on a.attachment_id = ua.attachment_id 
where ua.user_id = $userid 
union 
select a.* 
from users u 
join groups_attachments ga on ga.group_id = u.group_id 
join attachments a on a.attachment_id = ga.attachment_id 
where users.user_id = $userid 

替代$userid(还有你必须这样做三个地方)。

这个查询应该表现的很好。我已经编码了表格选择顺序并仔细加入以提供良好的性能。

你还没有说你的列名是什么,所以我做了合理的猜测。

+0

你先生是个天才!我只需要对第三部分进行小改动就可以运行。 而不是“从用户u”我需要“FROM users_groups ug”,并修正JOIN和WHERE适用 – samael