pakrauce
@pakrauce

Как построить SQL запрос?

В БД есть две таблицы с одинаковыми полями, с той разницей, что во второй таблице присутствует поле "дата". В первой таблицы перечисляются некие id и их характеристики в остальных полях. Во второй таблице могут присутствовать или не присутствовать id из первой. Тут может быть несколько строк с одним id, но разными датами. Вторая таблица нужна для того, чтобы указывать временные характеристики id на указанную дату.

Нужно в запросе. Пользователь указывает id и диапазон дат - начало и конец. Задача в результате получить таблицу, где в каждой строке указаны даты из диапазона по порядку. Если такая же дата есть во второй таблице для данного id, в колонке "дополнительно" написать фразу "временные изменения", если нет в той же колонке "нет изменений". Также нужно выбрать все остальные поля либо из второй таблицы либо из первой, если во второй на данную дату ничего нет.

Трудность у меня возникает во-первых в том, как вывести ВСЕ даты из диапазона, даже если даты нет во второй таблице. Во-вторых как объединить два запроса на выборку, если в первой таблице нет поля "дата".
  • Вопрос задан
  • 252 просмотра
Пригласить эксперта
Ответы на вопрос 1
Rsa97
@Rsa97
Для правильного вопроса надо знать половину ответа
Перебор всех дат в диапазоне - либо средствами клиента, либо заранее создать календарную таблицу, содержащую все даты, скажем, этого века. Запрос по одной дате:
SELECT `t2`.`id`, IFNULL(`t2`.`field1`, `t1`.`field1`), IFNULL(`t2`.`field2`, `t1`.`field2`), ...
    FROM `table1` AS `t1`
    LEFT JOIN `table2` AS `t2` ON `t2`.`id` = `t1`.`id` AND `t2`.`date` = :date
    WHERE `t1`.`id` = :id

Запрос при наличии таблицы дат:
SELECT `c`.`date`, `t2`.`id`, IFNULL(`t2`.`field1`, `t1`.`field1`), IFNULL(`t2`.`field2`, `t1`.`field2`), ...
    FROM `calendar` AS `c`
    LEFT JOIN `table1` AS `t1` ON `t1`.`id` = :id
    LEFT JOIN `table2` AS `t2` ON `t2`.`id` = :id AND `t2`.`date` = `c`.`date`
    WHERE `c`.`date` BETWEEN :start_date AND :end_date
Ответ написан
Комментировать
Ваш ответ на вопрос

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

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