SQL: возвращать недействительные отзывы, сделанные для отеля - PullRequest
0 голосов
/ 25 октября 2019

У меня есть следующие таблицы:

БРОНИРОВАНИЕ, в котором хранятся 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;

Мой запрос возвращает кратные значениятот же вывод.

Может ли кто-нибудь указать, какие изменения мне нужно внести в мой код для достижения желаемого результата?

Приветствия!

1 Ответ

2 голосов
/ 25 октября 2019

Вы присоединяетесь к каждому бронированию, которое когда-либо имел гость, чтобы попытаться проверить, является ли конкретный отзыв действительным или нет. Это будет означать недействительность каждого отзыва, который гость когда-либо делал за все время, если он просто бронирует и останавливается в другом отеле после отзыва.

Как долго после пребывания человека в отеле вы хотите позвонитьновый отзыв действителен? Правильный способ сделать это - назвать отзыв действительным, если он сделан в течение Х дней после завершения бронирования для этого отеля, НЕ, если это отзыв до бронирования этого или любого отеля.

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
WHERE
   NOT EXISTS (
      SELECT *
      FROM
        booking b
      WHERE
        r.guest_no = b.guest_no
        AND r.hotel_id = b.hotel_id
        AND b.booking_end BETWEEN r.review_date - 90 AND r.review_date
   )
ORDER BY
   r.review_date;

Посмотрите, как это работает в SQL Fiddle

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...