2012-05-30 40 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