MySQL запросить доступность комнаты - PullRequest
0 голосов
/ 23 февраля 2011

Рассмотрение некоторых других вопросов с запросами о доступности 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 ]

2 голосов
/ 23 февраля 2011
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`
0 голосов
/ 23 февраля 2011

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

...