Php MySQL:4表“;有很多“通过”;参加

Php MySQL:4表“;有很多“通过”;参加,php,mysql,join,has-many-through,Php,Mysql,Join,Has Many Through,假设我有以下4张桌子(举例来说):车主、卡车、箱子、苹果 一个主人可以有许多卡车,一辆卡车可以有许多箱子,一个箱子可以有许多苹果 车主有id。卡车有id和车主id。箱子有id和卡车id。苹果有id和箱子id 假设我想让id=34的所有者“拥有”所有的苹果。所以我想把所有的苹果都装在34号货主的卡车里的盒子里 有一个“层次结构”,如果你想要4个表,每个表只引用其直接的“父”。如何在满足其他3个表的条件的同时快速筛选框 我希望这有点道理 谢谢。您只需从“顶层”(所有者)开始,然后继续加入,直到达到您

假设我有以下4张桌子(举例来说):车主、卡车、箱子、苹果

一个主人可以有许多卡车,一辆卡车可以有许多箱子,一个箱子可以有许多苹果

车主有id。卡车有id和车主id。箱子有id和卡车id。苹果有id和箱子id

假设我想让id=34的所有者“拥有”所有的苹果。所以我想把所有的苹果都装在34号货主的卡车里的盒子里

有一个“层次结构”,如果你想要4个表,每个表只引用其直接的“父”。如何在满足其他3个表的条件的同时快速筛选框

我希望这有点道理

谢谢。

您只需从“顶层”(所有者)开始,然后继续加入,直到达到您想要的位置:

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
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表中。它使插入/更新数据变得更加困难,但可以使查询更加容易

    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的位置来简化此操作。

太棒了,谢谢!每个人都给了我相同的答案,但这一个比Eric的回答更合适,因为在这种情况下,我不需要访问所有者的信息。感谢您提供关于从“顶部”开始的提示。我对sql连接还是个新手,像这样的简单提示真的很有帮助。