Как задать условия на получение определённых столбцов в результате запроса?

Как вернуть результат с определёнными столбцами в зависимости от наличия строк в связанных таблицах?

Если в связанных таблицах нет записей соответствующих условию (таблица tt не в счёт), то выводить в результате только строки со столбцами:

`vv`.`id`, `vv`.`name`, `tt`.`name_ru`, `vv`.`price`

Если есть все записи, то результат должен быть со всеми указанными в SELECT столбцами. Перерыл весь интернет, возможно что-то не понял, но из того что я пробовал, ничего не работает. Такая задача вообще выполнима? Если нет, то как иначе можно это реализовать?

Мой запрос (MySQL) частично выполняет эту задумку, но он возвращает все столбцы при любом случае:

SELECT `vv`.`id`, `vv`.`name`, `tt`.`name_ru`, `vv`.`price`, /* Столбцы которые необходимо вернуть в любом случае */
`ss`.`data_create`, `ss`.`sell_price`, /* В случае отсутствия результатов в данной таблице, не возвращать данные столбцы */
`tp`.`engine_health`, `tp`.`engine_level`, `tp`.`brake_level`, `tp`.`suspension_level`, `tp`.`transmission_level` /* В случае отсутствия результатов в данной таблице, не возвращать данные столбцы */
FROM `vehicles` `vv`
INNER JOIN `types` `tt`, `statistics` `ss`, `tuning_pack` `tp`
WHERE `vv`.`id` = '1'
AND `vv`.`type_id` = `tt`.`id`
AND `ss`.`vehicle_id` = `vv`.`id`
AND `tp`.`id` = `ss`.`id`

Но если WHERE `vv`.`id` = '1' изменить значение на 2 вместо 1, то под id 2 записей в таблицах ss и tp нет. Соответственно по задумке, должно вернуть результат со строкой только столбы vv.id, vv.name, tt.name_ru, vv.price

Структура таблиц такая:

  • vv - Таблица машин - имеет поле которое ссылается на id типа машин (из tt)
  • tt - Таблица типа машин
  • ss - Таблица статистики машин - если есть статистика по машине, то в ней есть ссылка на id машины (из vv) и на id состояния машины (из tp)
  • tp - Таблица состояния машин

Буду благодарен за помощь.


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

Автор решения: Alex R.

Количество столбцов в запросе постоянно для всех строк.

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

Так coalesce принимает список значений и возвращает первое из них, которое не равно NULL. Т.е. если бы в таблице tt была дата, то coalesce(ss.data_create, tt.data_create) вернул ту дату, которая первая не пустая.

→ Ссылка