Задать вопрос

Можно ли это все связать в одном запросе?

Всех приветствую.
Из кучи связанных таблиц нужно получить новую, в которой значение поля, ссылающееся на связанную таблицу станет столбцом, а значением полей этого столбца станет значение из связанной таблицы.
Что у меня получилось:
Первым запросом получаю товар:
SELECT id as my_product_id, name as my_product_name
FROM products
WHERE id = 'ПЧ9'

Результат:
WfrDGOX1S22_VEXZblFXDw.png
Далее связываю ее с таблицей, где лежит информация о связях, вот она:
wLL7MaurTDCUBPfs4nrxog.png
Столбец book_name является названием таблицы, где лежит значение, а book_id - соответственно id, к примеру строка, где book_name = book_format_disk и book_id = 1 соответствует таблице book_format_disk и полю с id 1:
LopyS-qRQf6VJXyqq3OQaw.png
SQL запрос для связи:
SELECT id as my_product_id, name as my_product_name, book_name AS book_bind_name, book_id AS book_bind_id
FROM products
JOIN product_book on product_book.product_id = products.id
WHERE id = 'ПЧ9'

Результат:
lTuobBe_TaqPbabys1wzUg.png
Один JOIN у меня получился, запрос:
SELECT products.id as my_product_id, products.name as my_product_name, book_name AS book_bind_name, book_binding.name AS book_binding_name
FROM products
JOIN product_book on product_book.product_id = products.id
JOIN book_binding ON book_name = 'book_binding' AND book_binding.id = product_book.book_id
WHERE products.id = 'ПЧ9'

Результат:
fWyZJFs3T-CdfN9plltfmg.png
В столбец book_binding_name легло значение из таблицы book_binding с id 2, т.е 'Мягкий'.
Таким же образом мне надо стянуть информацию и с остальных таблиц, только как - второй день не пойму.
Можно ли вообще эту задачу выполнить одним запросом или есть другие методы?
Спасибо.
  • Вопрос задан
  • 150 просмотров
Подписаться 1 Средний 4 комментария
Решения вопроса 1
@pool
SELECT products.id as my_product_id, products.name as my_product_name,
group_concat(bb.name) AS book_binding_name,
group_concat(bl.name) AS book_language_name,
group_concat(ba.name) AS book_authors_name
FROM products,product_book
LEFT JOIN book_binding bb ON book_name = 'book_binding' AND bb.id = product_book.book_id
LEFT JOIN book_language bl ON book_name = 'book_language' AND bl.id = product_book.book_id
LEFT JOIN book_authors ba ON book_name = 'book_authors' AND ba.id = product_book.book_id
WHERE products.id = 'ПЧ9' and product_book.product_id = products.id group by products.id
Ответ написан
Комментировать
Пригласить эксперта
Ответы на вопрос 2
@BorisKorobkov Куратор тега MySQL
Web developer
Столбец book_name является названием таблицы

На чистом SQL подменить имя таблицы не получится.

Вариант 1. Использовать любой ЯП (например, PHP): первым запросом получить данные, из них построить второй запрос.

Вариант 2 (говнокод). Одним SQL-запросом всегда left-джойнить все возможные таблицы и потом с помощью IF брать данные из нужной.

Вариант 3 (правильный): спроектировать правильную структуру таблиц.
Ответ написан
Комментировать
HeadOnFire
@HeadOnFire
PHP, Laravel & WordPress Evangelist
JOIN в MySQL является синонимом INNER JOIN. А в вашем случае, если я правильно понял ваше сумбурное описание, нужен LEFT JOIN.

Впрочем, описание у вас весьма сложное для понимания, и без schema и примерных данных сложно понять все целиком.
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы