【问题标题】:MySQL: 4 Table "has-many-through" Join?MySQL:4 表“has-many-through”加入?
【发布时间】:2011-02-08 02:15:40
【问题描述】:

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

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

所有者有一个 ID。卡车有一个 id 和 owner_id。盒子有一个 id 和 truck_id。苹果有一个 id 和 box_id。

假设我想获取 id = 34 的所有者“拥有”的所有苹果。因此,我想获取所有者 34 拥有的卡车中箱子中的所有苹果。

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

我希望这有点道理。

谢谢。

【问题讨论】:

    标签: php mysql join has-many-through


    【解决方案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 来简化此操作。

    【讨论】:

      【解决方案2】:

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

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

      【讨论】:

      • 感谢有关从“顶部”开始的提示。我对 sql 连接还是新手,所以像这样的简单提示真的很有帮助。
      【解决方案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
      

      【讨论】:

      • 太棒了,谢谢!每个人几乎都给了我相同的答案,但这个答案比 Eric 的答案更合适,因为在这种情况下我不需要访问所有者的信息。
      猜你喜欢
      • 1970-01-01
      • 2017-07-31
      • 1970-01-01
      • 1970-01-01
      • 2017-03-22
      • 2015-02-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多