MySQL запрос номер комнаты

Посмотрев на некоторые другие вопросы о доступности mysql, я понял, что мой подход немного отличается от других.

В основном у меня есть таблица дат, и каждая дата является строкой. В каждой строке есть поля, в которых указывается стоимость, тип номера и сколько дней должно быть зарезервировано для бронирования на эту дату. Таким образом, если в отеле есть 1 тип номера, он будет иметь 365 рядов, если будет 5 типов номеров, он будет иметь 1825 строк.

bd_id   int(10) NO  PRI NULL    auto_increment
bd_room_type    varchar(32)
bd_date date    NO
bd_price    decimal(8,2)
bd_h_id int(8)  NO /* Hotel id */
bd_available    tinyint(1) /* number of days you must book to include this date */

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

$q1 = "SELECT bd_h_id
FROM booking_dates
WHERE bd_date IN ('2011-02-16','2011-02-17','2011-02-18')
AND bd_available <= '3'
AND bd_room_type = 'single'
AND bd_price > '0'
GROUP BY bd_h_id
HAVING count(*) = '3'";

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

Затем я передаю этот запрос как переменную в другой запрос, который извлекает информацию об отеле, проверяет, возвращает ли подзапрос что-либо или нет.

$q = "SELECT c_title FROM c_content WHERE c_id IN ($q1) AND IF(($q1) > 0, 1, 0)";

Это нормально, однако, если подзапрос возвращает более 1 отеля, основной запрос выдает мне ошибку:

Подзапрос возвращает более 1 ряд

Я думал, потому что я использовал "IN", что все будет в порядке. Какие-либо предложения? Также, когда я собираюсь реализовать несколько подзапросов, решение также должно работать с этим.

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

2 ответа

Решение
IF(($q1) > 0, 1, 0)

Эта часть возвращает ошибку.

Кроме того, как у вас это есть, $q1 оценивается дважды, что, вероятно, не то, что вы хотите.

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

Следует также отметить, что IN с подзапросами довольно неэффективно в MySQL; будет работать намного быстрее с объединением:

SELECT `c_title` FROM `c_content` JOIN ($q1) `a` ON `c_content`.`c_id`=`a`.`bd_h_id`

Сообщение об ошибке относится к вашему IF(($q1) > 0, 1, 0) предложение в конце запроса. Вы не можете сравнить подзапрос с > если он возвращает более одной строки.

Другие вопросы по тегам