У меня есть следующие таблицы:
БРОНИРОВАНИЕ, в котором хранятся guest_no (номер гостя), booking_start (дата начала), booking_end (дата окончания) и hotel_id (номер отеля).
ОБЗОР, которыйхранит guest_no (номер гостя, который делает обзор) review_date (дата отзыва) и hotel_id (номер отеля, который проверяется).
GUEST, в котором хранятся guest_no (номер гостя) и guest_name (имя гостя).
HOTEL, в котором хранятся hotel_id (номер отеля) и hotel_name (название отеля).
Я хочу, чтобы мой запрос возвратил все отзывы, которые являются недействительными. Недействительный отзыв - это тот, в котором дата, в которую был сделан отзыв, предшествует дате окончания бронирования. Отзыв также может быть недействительным, если гость никогда не останавливался в этом отеле.
Например, гость останавливается в отеле 5 с 1 июня 2019 г. по 15 июня 2019 г. Если гость делает отзыв 14 июня 2019 г. недействителен - обзор также недействителен, если он сделан 29 мая 2019 года (до начала бронирования). Если гость делает отзыв об отеле 8 (в котором он не останавливался), отзыв также недействителен.
Это мой код:
SELECT
r.review_id,
g.guest_no,
g.guest_name,
h.hotel_id,
h.hotel_name,
r.review_date
FROM
(((review r
INNER JOIN
guest g
ON
r.guest_no = g.guest_no)
INNER JOIN
hotel h
ON
r.hotel_id = h.hotel_id)
INNER JOIN
booking b
ON
g.guest_no = b.guest_no)
WHERE
r.review_date < b.booking_start
OR
r.review_date BETWEEN b.booking_start AND b.booking_end
OR
r.hotel_id != b.hotel_id
ORDER BY
r.review_date;
Мой запрос возвращает кратные значениятот же вывод.
Может ли кто-нибудь указать, какие изменения мне нужно внести в мой код для достижения желаемого результата?
Приветствия!