Как объединить 2 разных таблицы на основе значения поля основной таблицы? - PullRequest
2 голосов
/ 25 июня 2019

Итак, у меня есть 3 таблицы с именами menus, products и categories.

Таблица меню имеет идентификатор, item_type, который может быть product | category и item_id.

Что бы я хотел сделать, это когда menu item_type = product, соедините его с таблицей продуктов ON products.id = menu.item_id и соедините с categories when item_type = category.

Это мой текущий запрос:

SELECT m.* FROM menus m 
LEFT JOIN products p ON p.id = m.item_id AND m.item_type = 'product' 
LEFT JOIN categories c ON c.id = m.item_id AND m.item_type = 'category'

Запрос работает, хотя я не вижу данных о товарах или категориях, прикрепленных к каждому меню.

Я что-то здесь упускаю? Благодаря.

Ответы [ 3 ]

5 голосов
/ 25 июня 2019

Вам нужно SELECT нужных вам столбцов. Вы выбираете только столбцы из таблицы menus, и это все, что вы получаете.

Я бы предложил выбрать столбцы из двух других таблиц, но объединить их, используя COALESCE():

SELECT m.*,
       COALESCE(p.name, c.name) as name,  -- or whatever the columns are
       -- repeat for additional columns that you want
FROM menus m LEFT JOIN
     products p
     ON p.id = m.item_id AND m.item_type = 'product' LEFT JOIN
     categories c
     ON c.id = m.item_id AND m.item_type = 'category'
4 голосов
/ 25 июня 2019

Вы выбираете только значения в меню, используя SELECT m.*

Правильный запрос - просто использовать * или поля, которые вам нужны.

SELECT * FROM menus m 
LEFT JOIN products p ON p.id = m.item_id AND m.item_type = 'product' 
LEFT JOIN categories c ON c.id = m.item_id AND m.item_type = 'category'
2 голосов
/ 25 июня 2019

Вам необходимо также включить поля таблиц в JOIN, поскольку вы выбираете только поля таблицы m.

В конце концов вам также может понадобиться сделать ваши объединения OUTER, чтобы по-прежнему включать записи, которые не соответствуют ни одному из ваших двух объединений: например: меню с другим item_type (что не является вашим реальным вариантом использования) как я сейчас вижу, кстати)

SELECT m.*, p.*, c.* FROM menus m 
LEFT JOIN products p ON p.id = m.item_id AND m.item_type = 'product' 
LEFT JOIN categories c ON c.id = m.item_id AND m.item_type = 'category'

Должно быть достаточно для возврата всех ваших menu записей, некоторые из которых содержат только информацию о продукте (NULL значения для полей категории) и наоборот:

  • p. * Значения с NULL s, когда item_type = category
  • c. * Значения с NULL с, когда item_type = menu
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...