То, что я пытаюсь сделать, это:
Укажите количество доступности номеров на основе дат проверки и проверки.
Вот таблицы:
categories
id | name
1 | Luxe
2 | Deluxe
reservations
id | category_id | checkin | checkout
1 | 1 | 2018-01-06 | 2018-01-10
1 | 2 | 2018-01-11 | 2018-01-13
3 | 2 | 2018-01-13 | 2018-01-17
Ожидаемый результат
Поскольку category_id = 2
доступен с 2018-01-06
по 2018-01-10
(см. Первую строку в таблице reservations
), я пытаюсь включить его количество доступности, когда вы выбираете общее количество.
Поэтому при выполнении этого запроса
SELECT
categories.name AS category,
COUNT(reservations.id) AS free_count
FROM reservations
INNER JOIN categories ON categories.id = reservations.category_id
WHERE checkin BETWEEN '2018-01-06' AND '2018-01-10'
GROUP BY categories.name, reservations.id
Выход:
category | free_count
Luxe | 1
Однако я хочу, чтобы результат был следующим:
category | free_count
Luxe | 1
Deluxe | 0
т.е. заменить несогласованные строки на ноль. Как это можно сделать? Очень приветствуется решение без вложенных запросов (из-за их низкой производительности).
Используйте LEFT JOIN
вместо INNER JOIN
SELECT
c.name AS category,
COUNT(r.id) AS free_count
FROM categories c
LEFT JOIN reservations r
ON c.id = r.category_id
AND checkin BETWEEN '2018-01-06' AND '2018-01-10'
GROUP BY c.name
Важно сохранить фильтр checkin
в состоянии ON
. Когда вы сохраняете правильный фильтр таблицы в предложении Where
, несоответствующие записи будут иметь значения NULL
которые будут отфильтрованы в результате из-за условия where
(в основном Left join
будет преобразован во Inner join
)
table x
, сделайте левое соединение с таблицей категорий.