2012-05-30 5 views
3

저는 현재하고 싶은 MySQL 쿼리를 고민하고 있습니다. 내가 잠을 자지 않은 것에 따라 나는 명확히 생각하지 않고있을 수있다. 그러나 나는 이것을 잠시 동안 조금 붙 들었다.여러 테이블에 걸쳐 조인 된 쿼리를 작성하는 데 어려움이 있습니다.

내 사이트 사용자가 액세스 할 수있는 모든 첨부 파일을 반환하는 쿼리를 작성하려고합니다. 모든 첨부 파일에는 owner_id이 연관되어 있으며 테이블을 통해 attachments 테이블에 연결된 그룹이 있습니다.

그래서 내 테이블은 다음과 같습니다

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

첨부 파일, 그룹 및 사용자 모두 자신의 ID를 가지고 있고 연결 테이블이 연결되는 각 테이블의 ID를 보유하고 있습니다.

내가 어느 attachment.owner_idusers.user_id 일치하면 첨부 한 모든 필드를 선택하고자하거나 users.user_idusers_attachments 인 경우 (경우 소유자 권한을 부여 구체적) 또는 users.user_id를 통해 첨부 관련된 그룹에 대한 users_groups에 있으면 users_attachments.

답변

1

하나 개의 마법 쿼리로 모든 것을 할하려고하지 마십시오 - UNION을 함께 일련의 쿼리를 사용 : 대상 사용자 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

너는 천재 야! 나는 그것이 작동하도록 세 번째 부분을 약간 변경해야했습니다. "from users u"대신 "FRY users_groups ug"가 필요하고 JOIN을 적용하고 적용 할 수있는 곳은 어디입니까? – samael

관련 문제