@Renhor

Хочу достать из БД несколько таблиц, связанных между собой, через INNER JOIN не получается, как сделать?

Есть 4 таблицы: orders, users, booster_info, reviews

1) Из первой таблицы orders нужны все колонки
2) Из второй таблицы users нужна колонка username
3) Из третьей таблицы booster_info нужна колонка earned
4) Из четвертой таблицы reviews нужна колонка id

1) Записей должно получится столько, сколько есть записей в orders с фильтром WHERE order_status = '5'
2) В users есть колонка id, которая совпадает с колонкой booster_id в orders
3) В booster_info есть колонка booster_id, которая совпадает с колонкой booster_id в orders
4) В reviews есть колонка order_id, которая совпадает с колонкой order_id в orders

При этом записей в таблице reviews может и не быть (нужно просто знать, есть ли запись по нужному order или нет)

Запросы, которые я смог составить:

SELECT o.*, b.earned AS booster_earned, u.username AS booster_name FROM orders AS o INNER JOIN booster_info AS b ON o.booster_id = b.booster_id INNER JOIN users AS u ON o.booster_id = u.id WHERE o.order_status='5'

Первый запрос работает как надо, но когда я добавляю к нему таблицу reviews (она пустая, второй запрос), перестает выдавать результаты, собственно вопрос, как сделать, чтобы все равно извлекались записи как в первом запросе, но с пустым значением в r.id AS review_id (с пустым конечно, если нету соотв. записей)

SELECT o.*, b.earned AS booster_earned, u.username AS booster_name, r.id AS review_id FROM orders AS o INNER JOIN booster_info AS b ON o.booster_id = b.booster_id INNER JOIN users AS u ON o.booster_id = u.id INNER JOIN reviews AS r ON o.order_id = r.order_id WHERE o.order_status='5'
  • Вопрос задан
  • 392 просмотра
Решения вопроса 1
@Vlad_fox
в вашем случае надо использовать не внутреннее соединение INNER JOIN, а внешнее LEFT JOIN ваша_табличка_возможно _пустая. получится:
SELECT o.*, b.earned AS booster_earned, u.username AS booster_name, r.id AS review_id 
FROM orders AS o 
INNER JOIN booster_info AS b ON o.booster_id = b.booster_id 
INNER JOIN users AS u ON o.booster_id = u.id 
LEFT JOIN reviews AS r ON o.order_id = r.order_id 
WHERE o.order_status='5'
Ответ написан
Пригласить эксперта
Ответы на вопрос 2
@hidden_pingvin
Читайте про виды JOIN ну и заодно про GROUP BY.
Ответ написан
Комментировать
zoroda
@zoroda
Необычный Fullstack
Вот тут про нестрогое соединение
Ответ написан
Комментировать
Ваш ответ на вопрос

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

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