Я пытаюсь написать запрос, получая информацию из четырех таблиц, и я не могу понять это. Может кто-нибудь, пожалуйста, помогите мне с некоторыми рекомендациями?
Модель заключается в том, что пользователь может забронировать номер на определенный период времени. Я хотел бы получить актуальные данные за следующие семь дней, поэтому я использую WEEK и DATEDIFF. DATEDIFF должен убедиться, что я не получу информацию о бронировании номеров в будущем или более года назад. У меня есть четыре таблицы: пользователи, комнаты, время, бронирование
ПОЛЬЗОВАТЕЛИ:
CREATE TABLE IF NOT EXISTS users (
apartmentNumber varchar(4) NOT NULL,
surname varchar(50) NOT NULL,
password varchar(40) NOT NULL,
PRIMARY KEY (apartmentNumber)
)
НОМЕРА:
CREATE TABLE IF NOT EXISTS rooms (
id int(11) NOT NULL auto_increment,
name varchar(40) NOT NULL,
PRIMARY KEY (id),
KEY name (name)
)
РАЗ:
CREATE TABLE IF NOT EXISTS times (
id int(11) NOT NULL auto_increment,
start time NOT NULL,
stop time NOT NULL,
PRIMARY KEY (id),
KEY start (start)
)
БРОНИРОВАНИЕ:
CREATE TABLE IF NOT EXISTS bookings (
id int(11) NOT NULL auto_increment,
user varchar(4) NOT NULL,
room int(11) NOT NULL,
date date NOT NULL,
time int(11) NOT NULL,
PRIMARY KEY (id),
KEY room (room),
KEY time (time),
KEY user (user)
)
Я заполнил эти таблицы следующими данными:
INSERT INTO bookings (id, user, room, date, time) VALUES
(1, '0379', 1, '2009-11-19', 1),
(2, '0379', 1, '2009-11-23', 2),
(3, '0379', 1, '2009-11-14', 3),
(4, '0379', 2, '2009-11-23', 3),
(5, '0379', 2, '2009-11-19', 2),
(6, '0379', 2, '2009-11-20', 1);
ALTER TABLE bookings
ADD CONSTRAINT bookings_ibfk_2 FOREIGN KEY (room) REFERENCES rooms (id) ON DELETE CASCADE ON UPDATE CASCADE,
ADD CONSTRAINT bookings_ibfk_3 FOREIGN KEY (user) REFERENCES users (apartmentNumber) ON DELETE CASCADE ON UPDATE CASCADE,
ADD CONSTRAINT bookings_ibfk_4 FOREIGN KEY (time) REFERENCES times (id) ON DELETE CASCADE ON UPDATE CASCADE;
INSERT INTO rooms (id, name) VALUES
(1, 'Room 1'),
(2, 'Room 2');
INSERT INTO times (id, start, stop) VALUES
(1, '07:00:00', '12:00:00'),
(2, '12:00:00', '17:00:00'),
(3, '17:00:00', '22:00:00');
INSERT INTO users (apartmentNumber, surname, password) VALUES
('0379', 'Smith', 'password');
Перед добавлением таблицы времен (поскольку время ранее было в таблице заказов) мне удалось получить данные с помощью следующего запроса:
SELECT users.surname, users.apartmentNumber, rooms.name as room, bookings.date, bookings.time
FROM bookings, rooms, users
WHERE WEEK(NOW(), 7) = WEEK(bookings.date, 7)
AND DATEDIFF(NOW(), bookings.date) < 1
AND DATEDIFF(NOW(), bookings.date) > -10
AND users.apartmentNumber = bookings.user
AND bookings.room = rooms.id
ORDER BY room, bookings.time, bookings.date ASC;
Но после того, как я выбил время в отдельную таблицу, я не могу этого сделать:
SELECT users.surname, users.apartmentNumber, rooms.name as room, bookings.date, times.start, times.stop
FROM bookings, rooms, users, times
WHERE WEEK(NOW(), 7) = WEEK(bookings.date, 7)
AND DATEDIFF(NOW(), bookings.date) < 1
AND DATEDIFF(NOW(), bookings.date) > -10
AND users.apartmentNumber = bookings.user
AND bookings.room = rooms.id
AND times.id = bookings.time
ORDER BY room, bookings.time, bookings.date ASC;
Набор результатов из приведенного выше запроса:
Smith 379 Room 2 2009-11-20 07:00:00 12:00:00
но он должен включать два бронирования на 23 ноября 2009 г.
Я потерялся ... любые комментарии будут оценены. Спасибо!
/Андерс