MySQL:4表“has-many-through”加入?

时间:2010-04-14 19:57:09

标签: php mysql join has-many-through

假设我有以下4张桌子(例如):所有者,卡车,盒子,苹果。

拥有者可以有很多卡车,卡车可以有很多箱子,箱子可以有很多苹果。

所有者拥有身份证明。卡车有一个id和owner_id。盒子有id和truck_id。苹果有一个id和box_id。

假设我想让所有拥有id = 34的拥有者“拥有”苹果。所以我想得到所有拥有34所拥有卡车的盒子里的苹果。

如果您将使用4个表,每个表只引用其直接“父”,则存在“层次结构”。如何在满足其他3个表格的条件的同时快速过滤框?

我希望这有点意义。

感谢。

3 个答案:

答案 0 :(得分: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

答案 1 :(得分: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添加到apples表中。它使插入/更新数据变得更加困难,但可以使查询更容易。

答案 2 :(得分: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的位置来简化此操作。