2010-04-14 44 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,如果你不以后需要有关所有者的任何信息有所简化此。