4

次の4つのテーブルがあるとしましょう(例として):所有者、トラック、ボックス、リンゴ。

所有者は多くのトラックを持つことができ、トラックは多くの箱を持つことができ、箱は多くのリンゴを持つことができます。

所有者にはIDがあります。トラックにはidとowner_idがあります。ボックスにはidとtruck_idがあります。リンゴにはidとbox_idがあります。

id = 34の​​所有者が「所有」しているすべてのリンゴを取得したいとします。したがって、所有者34が所有するトラックの箱に入っているすべてのリンゴを取得したいとします。

それぞれが直接の「親」への参照のみを持つ4つのテーブルの場合、「階層」があります。他の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 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 に答える
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の​​場所を選択するだけで、これをいくらか単純化できます。

于 2010-04-14T20:02:16.883 に答える