PHP / SQL-как я могу отфильтровать запись, которая имеет столкновение с данными другой таблицы?

Я делаю запрос комнаты поиска, который ищет доступные номера на основе пользовательского ввода; количество кроватей, дата заезда и дата отъезда. Текущий код работает для поиска номеров на основе количества кроватей, но он не может отфильтровать номера с существующими бронированиями, диапазон дат которых перекрывается с датами ввода пользователя. Это текущий код:

$sql = "SELECT rooms.rid, beds, orientation, price FROM rooms 
        WHERE beds = $nOfBeds AND rooms.rid NOT IN 
                (SELECT bookings.rid FROM bookings 
                 WHERE $cInDate BETWEEN checkin AND checkout OR 
                ($cInDate <= checkin AND $cOutDate >= checkout))";

if ($rOrientation != "") {
$sql .= " AND orientation = '$rOrientation'";
}

$results = mysqli_query($conn, $sql)
or die ('Problem with query' . mysqli_error($conn));

это моя таблица заказов:
изображение

это мой стол номера:

pic2

2 ответа

  1. ($cInDate <= checkin AND $cOutDate >= checkout)
    

    имеет недостатки, так как это только ограничивает более длительное пребывание.

    Вы смогли заменить его:

    ($cInDate <= checkin AND $cOutDate >= checkin)
    
  2. Жюли Пеллетье права в том, что пункт where о дате регистрации и проверки является ошибочным. Но есть лучший способ исправить это.

    Вам нужны все те бронирования, которые не лежат в окне, указанном пользователем. Итак, если вы можете сделать следующие предположения:

    • Пользовательский ввод $cInDate
    • В вашей базе данных checkin

    Тогда все, что вам нужно, это следующий запрос:

    WHERE ($cOutDate < checkin OR $cInDate > checkout)
    

    Кроме того, во внутреннем запросе может потребоваться изменить SELECT bookings.rid FROM bookingsНа SELECT DISTINCT bookings.rid FROM bookingsдля оптимизации INпредложения на нем.