Как вывести вместо одной записи из таблицы базы данных несколько других записей из другой таблицы по условию?

Есть две таблицы и пример их заполнения:

Таблица Основная:

введите сюда описание изображения

Таблица Второстепенная:

введите сюда описание изображения

Необходимо вывести на экран данные из этих двух таблиц таким образом, чтобы в Основной таблице в тех записях, где значение столбца split равно 1 вместо этих записей выводились записи из Второстепенной таблицы (по id этой записи).

Пример вывода:

введите сюда описание изображения

Можно ли реализовать такой комплексный запрос в базу данных? Чтобы на выходе получился готовый ассоциативный массив, который можно было бы вывести на экран и легко с ним работать (фильтровать, сортировать и тд)?


Ответы (3 шт):

Автор решения: askarr

Думаю, ты имеешь в виду так называемые Join'ы

Например, в твоём случае (если я неправильно понял, поправь):

SELECT * FROM `Основная` JOIN `Второстепенная` ON `Основная`.id=`Второстепенная`.id_item WHERE `Основная`.split = 1

Чтобы менять названия полей, можно использовать Alias. Нужно лишь указать везде, где нужно кастомное название столбца таблицы, ключевое слово AS

→ Ссылка
Автор решения: Akina

Самый простой, и в то же время, наверное, самый производительный путь - два отдельных подзапроса и объединение результатов:

  SELECT name, price, quantity, sum
  FROM maintable
  WHERE split IS NULL
UNION ALL
  SELECT maintable.name, slavetable.price, slavetable.quantity, slavetable.sum
  FROM maintable
  JOIN slavetable ON maintable.id = slavetable.item_id
  WHERE maintable.split IS NOT NULL;
→ Ссылка
Автор решения: teran

Вариант с джойнами:

SELECT m.id
    , m.name
    , m.price
    , IFNULL(s.qunatity, m.quantity) AS qnt 
    , IFNULL(s.sum, m.sum) AS sum
FROM main_table AS m
LEFT JOIN slave_table AS s ON (
    s.id_item = m.id
    AND m.split = 1
)
→ Ссылка