4

假设我有以下 4 个表(例如): Owners、Trucks、Boxes、Apples。

一个车主可以有很多卡车,一辆卡车可以有很多箱子,一个箱子可以有很多苹果。

业主有身份证。卡车有一个 id 和 owner_id。盒子有一个 id 和 truck_id。苹果有一个 id 和 box_id。

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

如果您愿意,则有一个“层次结构”,每个表都只引用其直接“父级”。如何在满足其他 3 个表的条件的同时快速过滤框?

我希望这有点道理。

谢谢。

4

3 回答 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
于 2010-04-14T19:59:47.073 回答
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

如果您以后不需要有关所有者的任何信息,您可以通过省略与所有者的连接并仅选择 where t.owner_id = 34 来简化这一点。

于 2010-04-14T20:02:16.883 回答
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 表中。它使插入/更新数据变得更加困难,但可以使查询更容易。

于 2010-04-14T20:00:28.523 回答