假设我有以下4张桌子(例如):所有者,卡车,盒子,苹果。
拥有者可以有很多卡车,卡车可以有很多箱子,箱子可以有很多苹果。
所有者拥有身份证明。卡车有一个id和owner_id。盒子有id和truck_id。苹果有一个id和box_id。
假设我想让所有拥有id = 34的拥有者“拥有”苹果。所以我想得到所有拥有34所拥有卡车的盒子里的苹果。
如果您将使用4个表,每个表只引用其直接“父”,则存在“层次结构”。如何在满足其他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的位置来简化此操作。