J'essaye d'écrire une requête obtenant l'information de quatre tables et je ne peux pas la comprendre. Quelqu'un peut-il m'aider s'il vous plaît avec quelques conseils?MySQL joignant quatre tables et utilisant WEEK et DATEDIFF pour obtenir des données actuelles?
Le modèle est qu'un utilisateur peut réserver une pièce pour une période donnée. Je voudrais récupérer les données qui sont en cours pour les sept prochains jours, donc j'utilise WEEK et DATEDIFF. Le DATEDIFF est de s'assurer que je ne récupère aucune réservation de chambre qui se passe dans le futur ou il y a plus d'un an. J'ai quatre tables: les utilisateurs, les chambres, horaires, réservations
UTILISATEURS:
CREATE TABLE IF NOT EXISTS users (
apartmentNumber varchar(4) NOT NULL,
surname varchar(50) NOT NULL,
password varchar(40) NOT NULL,
PRIMARY KEY (apartmentNumber)
)
CHAMBRES:
CREATE TABLE IF NOT EXISTS rooms (
id int(11) NOT NULL auto_increment,
name varchar(40) NOT NULL,
PRIMARY KEY (id),
KEY name (name)
)
TIMES:
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)
)
RÉSERVATIONS:
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)
)
J'ai peuplé ces tables avec les données suivantes:
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');
Avant d'ajouter la table fois (comme le temps étaient auparavant dans le tableau des réservations) J'ai réussi à obtenir les données avec la requête suivante:
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;
Mais après avoir rompu les temps à une table séparée, je ne suis pas capable de le faire:
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;
Le jeu de résultats de t il est au-dessus de la requête:
Smith 379 Room 2 2009-11-20 07:00:00 12:00:00
mais il devrait inclure les deux réservations sur 2009-11-23
Je suis perdu ... des commentaires seront appréciés. Merci!
/Anders