Как соединить три таблицы в одном запросе SQL?
С двумя таблицами JOIN понятен. А как соединить три таблицы: заказы, клиентов и товары — в одном SELECT? Можно ли писать несколько JOIN подряд и в каком порядке?
2 ответа
Да, JOIN-ы просто пишутся подряд, по одному JOIN ... ON на каждую следующую таблицу:
SELECT
o.id AS order_id,
c.name AS customer,
p.title AS product,
oi.quantity
FROM orders AS o
JOIN customers AS c ON o.customer_id = c.id
JOIN order_items AS oi ON oi.order_id = o.id
JOIN products AS p ON oi.product_id = p.id;
Идея такая: начинаем с одной таблицы (orders), подсоединяем к ней клиентов по customer_id, затем позиции заказа по order_id, затем товары по product_id. Каждый новый JOIN «прицепляется» к уже собранному результату по подходящему ключу.
Алиасы здесь обязательны по смыслу — без o, c, p имена столбцов станут громоздкими и неоднозначными (id есть почти везде).
Важные моменты:
- Для каждой пары таблиц нужен свой ON с правильными ключами. Перепутаете ключ — получите мусор или раздутый результат.
- Типы JOIN можно смешивать: где-то INNER, где-то LEFT. Если хотите показать заказ, даже если у товара нет описания, для этой связи возьмите LEFT JOIN.
- Часто связь «многие-ко-многим» (заказы и товары) идёт через промежуточную таблицу (
order_items) — поэтому таблиц в JOIN бывает и 4, и 5.
Порядок JOIN-ов на результат INNER-соединений не влияет, но для читаемости идите по логике связей.
Совет по отладке многотабличных JOIN: если строк вдруг стало намного больше, чем ожидали, скорее всего где-то «размножение» из-за связи один-ко-многим (у заказа несколько позиций) или забытого/неверного условия ON. Собирайте запрос постепенно — сначала две таблицы, проверьте число строк, потом добавляйте третью. Так сразу видно, какой JOIN всё раздул.