У меня есть две таблицы: 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
и ошибка синтаксиса есть? – potashin
Я думаю, что проблема заключается в вашей функции DATE(). Я думаю, вы хотели CURDATE(). http://dev.mysql.com/doc/refman/5.5/en/date-and-time-functions.html#function_date – emustac
@notulysses, синтаксическая ошибка: '' 'SQLSTATE [42000]: ошибка синтаксиса или нарушение доступа: 1064 У вас есть ошибка в синтаксисе SQL; проверьте руководство, соответствующее версии вашего сервера MySQL, для правильного синтаксиса для использования около ') AND HOUR (CURDATE()), НЕ МЕЖДУ 'begin_time' И' end_time'' в строке 12 '' '. Я пробовал 'CURDATE()', но это не решает проблему, к сожалению. – BasC