Скажем, у меня есть следующие 4 таблицы (для примера): владельцы, грузовики, ящики, яблоки.
У владельца может быть много грузовиков, у грузовика может быть много коробок, а в коробке может быть много яблок.
У владельцев есть идентификатор. Грузовики имеют идентификатор и owner_id. Коробки имеют id и truck_id. У яблок есть id и box_id.
Предположим, я хочу, чтобы все яблоки «принадлежали» владельцем с id = 34. Поэтому я хочу получить все яблоки, которые находятся в коробках, которые находятся в грузовиках, которыми владеет владелец 34.
Существует «иерархия», если вы будете из 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
Вы только начинаете с «топ» (владельцев) и продолжаете присоединяться, пока не доберетесь туда, где хотите:
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, если вам больше не нужна информация о владельце.