Запросите требуемые автомобили для диапазона дат - PullRequest
0 голосов
/ 13 февраля 2019

У меня есть две таблицы в базе данных.'автомобиль', 'резервирование'

таблица 'автомобиль' имеет следующие столбцы

id -> первичный ключ

name ->название автомобиля, например SUV, STANDARD, ECONOMY

count -> Количество доступных автомобилей

в таблице «Бронирование» есть следующие столбцы

id -> Автоматическое увеличение идентификатора резервирования

date_out -> Дата начала резервирования, например: '2019-01-01 00: 00: 00'

date_in -> Резервированиедата окончания, например: '2019-01-05 23: 59: 59'

car_name -> Одно из названий автомобилей из таблицы 'car'

Я хочу запросить базу данныхчтобы показать наличие / нехватку автомобилей каждого типа для диапазона дат.

Таким образом, выходные данные должны быть похожи на эту таблицу.

---- дата ----- car_name наличие / нехватка

2019-01-01 ---- Внедорожник ---- 1

2019-01-01 ЭКОНОМИКА -1

отрицательный знак указывает на недостаток

положительный знак указывает на наличие

Что я сделал

Этот запрос работает только для одной указанной даты и имени автомобиля.

Set @forDate = '2019-02-14';
Set @car = 'STANDARD';


Set @total_reservation = (select count(*) as total_reservation from (
select date_out, date_in, car_type from reservation 
where date_in > @forDate and date_out < @forDate
and car_type = @car
)AS t1);

select @total_reservation;

Set @car_count = (select count from car where name = @car);

select @car_count;

select @car_count - @total_reservation;

У меня проблема с преобразованием запроса для диапазона дат, введенного пользователем.

1 Ответ

0 голосов
/ 13 февраля 2019

Вы можете использовать таблицу дат .В следующем примере я просто введу даты:

SELECT datelist.dt, car.name, car.count - COUNT(reservation.id) AS available
FROM (
    SELECT '2019-02-14' AS dt UNION ALL -- check availability from date
    SELECT '2019-02-15' UNION ALL
    SELECT '2019-02-16' UNION ALL
    SELECT '2019-02-17' UNION ALL
    SELECT '2019-02-18' -- check availability to date
) AS datelist
CROSS JOIN car
LEFT JOIN reservation ON datelist.dt BETWEEN reservation.date_out AND reservation.date_in
      AND car.name = reservation.car_name
GROUP BY datelist.dt, car.name, car.count

В MySQL 8 вы можете использовать рекурсивный cte для построения дат:

WITH RECURSIVE datelist AS (
    SELECT '2019-02-14' + INTERVAL 0 DAY AS dt
    UNION ALL
    SELECT dt + INTERVAL 1 DAY FROM datelist WHERE dt < '2019-02-18'
)
SELECT datelist.dt, car.name, car.count - COUNT(reservation.id) AS available
FROM datelist
CROSS JOIN car
LEFT JOIN reservation ON datelist.dt BETWEEN reservation.date_out AND reservation.date_in
      AND car.name = reservation.car_name
GROUP BY datelist.dt, car.name, car.count
...