Считать несовпадающие строки как ноль - как? [Дубликат]

0

То, что я пытаюсь сделать, это:

Укажите количество доступности номеров на основе дат проверки и проверки.

Вот таблицы:

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

т.е. заменить несогласованные строки на ноль. Как это можно сделать? Очень приветствуется решение без вложенных запросов (из-за их низкой производительности).

  • 0
    оберните ваш запрос к некоторой table x , сделайте левое соединение с таблицей категорий.
  • 0
    @Krishna Кришна Можете ли вы объяснить смысл упаковки? Это просто создает псевдоним, не так ли?
Показать ещё 1 комментарий
Теги:

1 ответ

1
Лучший ответ

Используйте 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)

Ещё вопросы

Сообщество Overcoder
Наверх
Меню