MySQL: 4 Table „hat-viele-through“ Join?
-
27-09-2019 - |
Frage
Lassen Sie uns sagen, ich habe die folgenden vier Tabellen (Beispiele willen). Eigentümer, Trucks, Boxen, Äpfel
Ein Eigentümer viele Lastwagen haben kann, kann ein LKW viele Boxen haben und eine Schachtel viele Äpfel haben.
Eigentümer haben eine ID. Trucks hat eine ID und OWNER_ID. Boxen haben eine ID und truck_id. Äpfel haben eine ID und box_id.
Lassen Sie uns sagen, ich will von einem Eigentümer alle Äpfel „Besitz“ bekommen mit id = 34. Also habe ich alle, die Äpfel zu bekommen, die in den Kästen, die in Lastwagen sind, dass Eigentümer 34 besitzt.
Es gibt eine „Hierarchie“, wenn Sie werden von 4 Tabellen, dass jeder nur Bezug auf seine direkt „Eltern“ hat. Wie kann ich schnell Filterboxen während die Bedingungen für die anderen 3 Tabellen erfüllt?
Ich hoffe, dass Sinn gemacht etwas.
Danke.
Lösung
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
Andere Tipps
Sie beginnen gerade an der „Spitze“ (Besitzer) und halten, bis Sie Beitritt bekommen, wo Sie wollen:
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 = ?
Wenn Abfragen wie die erforderlich sind, häufig und Sie arbeiten mit sehr großen Datenmengen, manchmal ist es sinnvoll, auch die Daten ein wenig denormalize. Zum Beispiel durch die owner_id auf die Äpfel Tabelle hinzugefügt wird. Es macht das Einfügen / die Daten ein bisschen schwieriger zu aktualisieren, aber kann Abfragen erleichtern.
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
Sie können dies etwas vereinfachen, indem die an den Eigentümer kommen lassen und nur die Auswahl, wo t.owner_id 34 = wenn Sie keine Informationen über den Besitzer brauchen später.