Помогите пожалуйста составить запрос

Есть 2 таблицы:

И скрины с данными [![введите сюда описание изображения][1]][1]

[![введите сюда описание изображения][2]][2]

Нужно достать только те апартаменты в которых количество зарезервированных меньше чем установлено для каждого апартамента, здесь должны быть выведены строки с id 2 и 3, так как в редисон уже все слоты заняты

Мой запрос выглядит вот так

select * from apartment as a
LEFT JOIN (SELECT r.id, sum(r.guests) as guests FROM reservation AS r 
GROUP BY r.apartment_id ) as r ON a.id = r.id
WHERE a.slots > r.guests
 

Но он мне показывает только записи в которых есть резервации, и не показывает qubus hotel

Я понимаю, что проблема заключается в where последнем, но как мне тогда отфильтровать чтобы не показывало редисон в котором слоты заняты?


Ответы (1 шт):

Автор решения: Mike

В изначальном запросе условие в where сводит на нет эффект от left так как r.guests может быть NULL. Необходимо учитывать такую возможность и сравнивать a.slots > coalesce(r.guests, 0). Кроме того в условии ON допущена ошибка и сравниваются id двух таблиц, вместо использования apartment_id из reservation.

Кроме того следует говорить о занятости мест на конкретную дату и указывать это в запросе.

А вообще я бы написал этот запрос примерно так (но в некоторых случаях ваша трактовка может оказаться быстрее, надо сравнивать):

select a.*, sum(r.guests)
  from apartment as a
  left join reservation r ON r.apartment_id = a.id
    /* Добавить что то такое: AND ДАТА between r.start_date and r.end_date */
 GROUP BY a.apartment_id
HAVING a.slots > coalesce(sum(r.guests), 0)
→ Ссылка