MySQL - что не так с запросом? - PullRequest
1 голос
/ 18 марта 2010

Я пытаюсь запросить базу данных, чтобы найти следующее.

Если клиент ищет отель в городе между датами A и B, найдите и верните отели, в которых свободные номера между двумя датами.

В каждом номере будет более одной комнаты (то есть 5 комнат типа A, 10 комнат типа B и т. Д.), И мы должны запросить базу данных, чтобы найти только те отели, в которых есть хотя бы одна. комната свободна хотя бы в одном типе.

Это моя структура таблицы:

**Structure for table 'reservations'**
    reservation_id
    hotel_id
    room_id
    customer_id
    payment_id
    no_of_rooms
    check_in_date
    check_out_date
    reservation_date

    **Structure for table 'hotels'**
    hotel_id
    hotel_name
    hotel_description
    hotel_address
    hotel_location
    hotel_country
    hotel_city
    hotel_type
    hotel_stars
    hotel_image
    hotel_deleted


    **Structure for table 'rooms'**
    room_id
    hotel_id
    room_name
    max_persons
    total_rooms
    room_price
    room_image
    agent_commision
    room_facilities
    service_tax
    vat
    city_tax
    room_description
    room_deleted

А это мой запрос:

$city_search = '15';
$check_in_date = '29-03-2010';
$check_out_date = '31-03-2010';

$dateFormat_check_in = "DATE_FORMAT('$reservations.check_in_date','%d-%m-%Y')";
$dateFormat_check_out = "DATE_FORMAT('$reservations.check_out_date','%d-%m-%Y')";

$dateCheck = "$dateFormat_check_in >= '$check_in_date' AND  $dateFormat_check_out <= '$check_out_date'";

 $query = "SELECT $rooms.room_id,
                  $rooms.room_name,
                  $rooms.max_persons,
                  $rooms.room_price,
                  $hotels.hotel_id,
                  $hotels.hotel_name,
                  $hotels.hotel_stars,
                  $hotels.hotel_type
           FROM   $hotels,$rooms,$reservations
           WHERE  $hotels.hotel_city = '$city_search'
           AND    $hotels.hotel_id = $rooms.hotel_id
           AND    $hotels.hotel_deleted = '0'
           AND    $rooms.room_deleted = '0'
           AND    $rooms.total_rooms - (SELECT SUM($reservations.no_of_rooms) as tot
                                                   FROM $reservations
                                                   WHERE $dateCheck
                                                   GROUP BY $reservations.room_id) > '0'";

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

Дело в том, что запрос вообще не возвращает никакого результата. Хотя это должно произойти, если я сам вычислю это вручную.

Я пытался запустить подзапрос самостоятельно, но я не получил никакого результата. И я потерял некоторое количество волос, пытаясь убрать этот запрос со вчерашнего дня. Что с этим не так? Или есть лучший способ сделать то, что я упомянул выше?

Редактировать: Код отредактирован для удаления ошибки. Благодаря Марк Байерс .

Sample Data in reservation table

1   1   1   2   1   3   2010-03-29  2010-03-31  2010-03-17
2   1   2   3   3   8   2010-03-29  2010-03-31  2010-03-18
5   1   1   5   5   4   2010-03-29  2010-03-31  2010-03-12

Подзапрос должен вернуть

Room ID : 1    Rooms Booked : 7
Room ID : 2    Rooms Booked : 8

But it does not return any value at all.... If i remove the dateCheck condition it returns
Room ID : 2    Rooms Booked : 8

1 Ответ

1 голос
/ 18 марта 2010

Ваша проблема здесь:

$rooms.total_rooms - (SELECT SUM($reservations.no_of_rooms) as tot,
                                               $rooms.room_id as id
                                               FROM $reservations,$rooms
                                               WHERE $dateCheck
                                               GROUP BY $reservations.room_id) > '0'"

Вы делаете вычитание total_rooms - (tot, id), где первый операнд - скалярное значение, а второй - таблица с двумя столбцами. Удалите один из столбцов в наборе результатов и убедитесь, что вы возвращаете только одну строку.

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

Вы, вероятно, хотите что-то вроде этого:

SELECT column1, column2, etc...
FROM   $hotels
JOIN   $rooms
ON     $hotels.hotel_id = $rooms.hotel_id
JOIN   (
    SELECT SUM($reservations.no_of_rooms) as tot,
           $rooms.room_id as id
           FROM $reservations
           JOIN $rooms
           ON ??? /* Aren't you missing something here? */
           WHERE $dateCheck
           GROUP BY $reservations.room_id
) AS T1
ON     T1.id = room_id
WHERE  $hotels.hotel_city = '$city_search'
AND    $hotels.hotel_deleted = '0'
AND    $rooms.room_deleted = '0'
AND    $rooms.total_rooms - T1.tot > '0'
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...