MySQL запрос полного соединения с отображением записей, которые не соответствуют критериям - PullRequest
0 голосов
/ 25 октября 2019

Я строю систему бронирования отелей на C #, как портфельный проект, чтобы показать работодателям, когда я заканчиваю колледж.

В моей главной форме есть объект Calendar Calendar, который при щелчке по датеобновит DataGridView со всеми комнатами;и если в этой комнате есть резервирование на эту дату, оно будет отображено.

В базе данных MySQL используются две таблицы: «Комнаты» и «Резервирования»

Iбудут включать изображения с примерами данных, которые также показывают заголовки столбцов.

Поскольку я изучил SQL с использованием MSSQL, MySQL доставляет мне некоторые проблемы.

Для основной формы, чтобы показать данныеправильно, мне нужен запрос, чтобы вернуть ВСЕ комнаты, и есть ли в этом номере бронирование на указанную дату. В ходе некоторых исследований я обнаружил, что полное соединение будет правильным соединением, поскольку оно показывает все поля из обеих таблиц. Поскольку MySQL не поддерживает полные объединения, я нашел способ эмулировать его, используя

SELECT * FROM ROOMS r
LEFT JOIN RESERVATIONS rs ON r.RoomNumber = rs.RoomNumberReserved
UNION
SELECT * FROM ROOMS r
RIGHT JOIN RESERVATIONS rs ON r.RoomNumber = rs.RoomNumberReserved
WHERE
    rs.CheckInDate <= CURRENT_DATE
AND CAST((rs.CheckInDate + rs.NumberOfNights) AS DATE) > CURRENT_DATE

В предложении Where в основном говорится, что нужно отображать только те бронирования, у которых есть дата регистрации до или на дату, и проверкадата после даты. В основном показывает резервирование, которое активно в эту дату.

Однако пример резервирования показывает 100% времени, даже если он не соответствует критериям условия where. Объединение в ключевой части запроса работает хорошо, так как резервирование отображается рядом с нужной комнатой, но похоже, что предложение where не работает должным образом.

Я не уверен, что делать с этим, поэтому любая помощь, чтобы получить меня на правильном пути будет принята.

Спасибо

Таблица бронирования Таблица номеров

Ответы [ 3 ]

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

вам не нужно использовать union для этого. просто используйте оператор or по вашим критериям даты

SELECT * FROM ROOMS r
LEFT JOIN RESERVATIONS rs ON r.RoomNumber = rs.RoomNumberReserved
WHERE 1=1 or 
    current_date() between rs.CheckInDate and cast((rs.CheckInDate + rs.NumberOfNights) AS date)
0 голосов
/ 25 октября 2019

Вам не нужно использовать FULL JOIN;LEFT JOIN из ROOMS даст вам все строки в ROOMS независимо от того, есть ли какие-либо подходящие резервирования. Ключевой вопрос заключается в том, чтобы поместить любые условия для значений от RESERVATIONS в условие ON, чтобы вы не преобразовали LEFT JOIN в INNER JOIN (см. руководство ), которое затемне дать вам номера, которые не имеют бронирования. Обратите внимание, что вы также можете оптимизировать сравнение дат, используя BETWEEN и арифметику дат:

SELECT * FROM ROOMS r
LEFT JOIN RESERVATIONS rs ON r.RoomNumber = rs.RoomNumberReserved
  AND CURDATE() BETWEEN rs.CheckInDate AND rs.CheckInDate + INTERVAL rs.NumberOfNights - 1 DAY
0 голосов
/ 25 октября 2019

Необходимо применить условие where к результату union в дополнительном выборе. В качестве альтернативы можно применить условие where к лицу select. Таким образом, ваш запрос становится -

SELECT * FROM ROOMS r
LEFT JOIN RESERVATIONS rs ON r.RoomNumber = rs.RoomNumberReserved
WHERE
rs.CheckInDate <= CURRENT_DATE
AND CAST((rs.CheckInDate + rs.NumberOfNights) AS DATE) > CURRENT_DATE

UNION

SELECT * FROM ROOMS r
RIGHT JOIN RESERVATIONS rs ON r.RoomNumber = rs.RoomNumberReserved
WHERE
rs.CheckInDate <= CURRENT_DATE
AND CAST((rs.CheckInDate + rs.NumberOfNights) AS DATE) > CURRENT_DATE
...