Получение данных из связанных таблиц в NodeJS

Давайте сделаем запрос, который достанет всех юзеров вместе с их городами. Для этого понадобится команда LEFT JOIN:

Ее синтаксис выглядит следующим образом:

sqlSELECT поля FROM имя_таблицы
  LEFT JOIN имя_связанной_таблицы ON условие_связи
WHERE условие_выборки

Давайте разберем отдельные части синтаксиса этой команды.

Поля

Так как выборка идет из нескольких таблиц, то выборка всех полей через * не будет работать. Следующий запрос выберет поля только из основной таблицы, но не из связанной:

sqlSELECT *

Для того, чтобы данные выбирались из всех таблиц, нужно перед * указать имя таблицы для выборки:

sqlSELECT users.*, cities.*

Либо можно перечислить нужные нам поля с указанием имени таблицы перед ними:

sqlSELECT users.name, cities.name

Эти два способа имеют проблему. Дело в том, что если поля в таблицах имеют одинаковые имена, то в массиве произойдет конфликт имен и победит только одно поле, а второго не будет.

Для решения проблемы нужно конфликтные имена переименовывать через команду as:

sqlSELECT users.name, cities.name as city_name

Связь

После команды ON мы должны указать поля из двух таблиц, по которым осуществляется связь. В нашем случае это будет поле id из таблицы с городами и поле city_id из таблицы с юзерами:

sqlON cities.id=users.city_id

Запрос

В итоге запрос, который достанет юзеров вместе с их городами будет выглядеть следующим образом:

sqlSELECT
  users.name, cities.name as city_name
FROM
  users
LEFT JOIN cities ON cities.id=users.city_id

Практические задачи

Задание 1

Пусть у вас есть таблица с товарами и таблица с их категориями. Напишите запрос, который достанет названия товаров вместе с их категориями.