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)
предложение в конце запроса. Вы не можете сравнить подзапрос с >
если он возвращает более одной строки.