2010-04-14 3 views
4

예를 들어, 소유자, 트럭, 상자, 사과 등 4 개의 테이블이 있다고 가정 해 봅시다.MySQL : 4 테이블 "has-many-through"Join?

소유자는 많은 트럭을 가질 수 있고, 트럭은 많은 상자를 가질 수 있으며 상자는 많은 사과를 가질 수 있습니다.

소유자는 ID를가집니다. 트럭에는 id 및 owner_id가 있습니다. 상자에는 id 및 truck_id가 있습니다. 사과에는 id와 box_id가 있습니다.

id = 34 인 소유자가 모든 사과를 소유하고 싶다고 가정 해 봅시다. 소유자 34가 소유 한 트럭에있는 상자에있는 사과를 모두 가져오고 싶습니다.

직접 "부모"에 대한 참조 만 갖는 4 개의 테이블을 사용하는 경우 "계층 구조"가 있습니다. 다른 3 개의 테이블에서 조건을 만족하면서 상자를 신속하게 필터링 할 수 있습니까?

다소 의미가 있기를 바랍니다.

감사합니다.

답변

4
select a.* 
from Trucks t 
inner join Boxes b on t.id = b.truck_id 
inner join Apples a on b.id = a.box_id 
where t.owner_id = 34 
+0

눈부셔, 감사합니다! 모두들 거의 똑같은 대답을주었습니다. 그러나이 경우 소유자의 정보에 액세스 할 필요가 없으므로이 하나가 에릭의 응답보다 적절합니다. – nebs

1

당신은 단지 "최고"(소유자)에서 시작하고 원하는 위치 얻을 당신까지 합류 계속 :

SELECT a.* 
FROM Owners o 
INNER JOIN Trucks t ON t.owner_id = o.id 
INNER JOIN Boxes b on b.truck_id = t.id 
INNER JOIN Apples a on a.box_id = b.id 
WHERE o.id = ? 

를 쿼리가 그렇게 자주 필요한 경우와 매우 큰 데이터로 작업 데이터가 비정규 화되는 경우가 있습니다. 예를 들어, 사과 테이블에 owner_id를 추가합니다. 그것은 데이터 삽입/업데이트를 조금 더 어렵게 만들지 만 쿼리를 더 쉽게 만들 수 있습니다.

+0

"상단"부터 시작하는 것에 대해 감사드립니다. 나는 SQL join에 아직 익숙하지 않기 때문에 간단한 팁이 정말 도움이된다. – nebs

1
SELECT a.* 
     FROM Apples a 
INNER JOIN Boxes b ON b.id = a.box_id 
INNER JOIN Trucks t ON t.id = b.truck_id 
INNER JOIN Owners o ON o.id = t.owner_id 
    WHERE o.id = 34 

당신은이 소유자에게 가입 밖으로 떠나 나중에 소유자에 대한 정보를 필요로하지 않는 경우 어디서 t.owner_id = (34)을 선택하여 어느 정도이 문제를 단순화 할 수 있습니다.