2010-04-14 42 views
4

比方說,我有以下4個表格(舉例來說):業主,卡車,盒子,蘋果。MySQL:4表「has-many-through」加入?

業主可以有很多卡車,卡車可以有很多箱子,箱子可以有很多蘋果。

業主有一個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

輝煌,謝謝!每個人都給了我相同的答案,但這與Eric的回答相比更合適,因爲在這種情況下我不需要訪問所有者的信息。 – nebs 2010-04-14 20:18:12

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連接,所以像這樣簡單的提示真的有幫助。 – nebs 2010-04-14 20:26:12

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,如果你不以後需要有關所有者的任何信息有所簡化此。