MySQL: 4 Таблица «has-many-through» Join?

Скажем, у меня есть следующие 4 таблицы (для примера): владельцы, грузовики, ящики, яблоки.

У владельца может быть много грузовиков, у грузовика может быть много коробок, а в коробке может быть много яблок.

У владельцев есть идентификатор. Грузовики имеют идентификатор и owner_id. Коробки имеют id и truck_id. У яблок есть id и box_id.

Предположим, я хочу, чтобы все яблоки «принадлежали» владельцем с id = 34. Поэтому я хочу получить все яблоки, которые находятся в коробках, которые находятся в грузовиках, которыми владеет владелец 34.

Существует «иерархия», если вы будете из 4 таблиц, каждая из которых имеет ссылку на свой прямой «родительский». Как я могу быстро фильтровать поля, удовлетворяя условиям других трех таблиц?

Надеюсь, это имело смысл.

Благодарю.

Solutions Collecting From Web of "MySQL: 4 Таблица «has-many-through» Join?"

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 в таблицу яблок. Это затрудняет вставку / обновление данных, но может упростить выполнение запросов.

  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, если вам больше не нужна информация о владельце.