2015-01-30 3 views
-2

У меня есть две таблицы: rooms и scheduled. В плановом столе есть записи с begin_time, end_time и room_id - который отображается, когда номера забронированы. В таблице номеров содержатся записи с номером id для каждой комнаты.SQL-запрос с условием во второй таблице

begin_time и end_time содержат только часы, так что, например, «9» и «11», которые указывают, что номер забронирован с 9 до 11.

Я хочу, чтобы отобразить список номеров, в настоящее время доступны. Для этого мне нужен запрос, который выбирает все идентификаторы номера из таблицы rooms при условии, что в течение текущего часа нет записи в scheduled (так что текущий час не существует между begin_time и end_time для идентификатора номера).

Я попытался следующие:

SELECT DISTINCT id , room_nr FROM rooms WHERE NOT EXISTS(SELECT room_id FROM scheduled WHERE rooms.id = scheduled.room_id AND date = CURDATE() AND HOUR(CURDATE()) NOT BETWEEN `begin_time` AND `end_time`)

Но это не работает, показывает только номера, для которых id не существующие в scheduled на текущую дату - без условий времени. Я также пробовал что-то с присоединениями, но я их не понимаю. Как я могу сделать запрос, который возвращает id с rooms-table в соответствии с описанным условием?


UPDATE: я отстроил базу данных в этом MySQLFiddle: http://sqlfiddle.com/#!2/ecd82c

+1

и ошибка синтаксиса есть? – potashin

+0

Я думаю, что проблема заключается в вашей функции DATE(). Я думаю, вы хотели CURDATE(). http://dev.mysql.com/doc/refman/5.5/en/date-and-time-functions.html#function_date – emustac

+0

@notulysses, синтаксическая ошибка: '' 'SQLSTATE [42000]: ошибка синтаксиса или нарушение доступа: 1064 У вас есть ошибка в синтаксисе SQL; проверьте руководство, соответствующее версии вашего сервера MySQL, для правильного синтаксиса для использования около ') AND HOUR (CURDATE()), НЕ МЕЖДУ 'begin_time' И' end_time'' в строке 12 '' '. Я пробовал 'CURDATE()', но это не решает проблему, к сожалению. – BasC

ответ

0

Try следующий SQL-запрос:

SELECT DISTINCT id 
, room_nr 
FROM rooms 
WHERE NOT EXISTS(SELECT room_id 
    FROM scheduled 
    WHERE rooms.id = scheduled.room_id 
    AND date = CURDATE() 
    AND HOUR(CURTIME()) NOT BETWEEN `begin_time` AND `end_time`) 
+0

Спасибо, этот запрос дает результат, а не синтаксическую ошибку. Я думаю, это работает! Я собираюсь проверить это немного дальше! – BasC

+0

Запрос работает, но не выбирает правильные записи. Я отправлю SQL-скрипт. – BasC

+0

В вашем запросе выбирается все 'id' в' комнатах', для которых нет записи в 'запланированном' на текущую дату. Условие времени еще не работает. Вы можете это понять? – BasC

Смежные вопросы