Как задать условия на получение определённых столбцов в результате запроса?
Как вернуть результат с определёнными столбцами в зависимости от наличия строк в связанных таблицах?
Если в связанных таблицах нет записей соответствующих условию (таблица 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 шт):
Количество столбцов в запросе постоянно для всех строк.
Если это возможно для решения вашей задачи, то в одном столбце можно выводить разную информацию из разных столбцов по условию. Для этого можно, например, воспользоваться функциями coalesce или case.
Так coalesce принимает список значений и возвращает первое из них, которое не равно NULL. Т.е. если бы в таблице tt была дата, то coalesce(ss.data_create, tt.data_create) вернул ту дату, которая первая не пустая.