MySQL连接四个表并使用WEEK和DATEDIFF获取当前数据?

MySQL连接四个表并使用WEEK和DATEDIFF获取当前数据?,mysql,join,datediff,Mysql,Join,Datediff,我试图编写一个查询,从四个表中获取信息,但我无法理解它。有人能帮我做些指导吗 模型是用户可以在指定的时间段内预订房间。我想检索未来七天的最新数据,所以我使用WEEK和DATEDIFF。DATEDIFF是为了确保我不会在未来或一年多以前收到任何房间预订。我有四张桌子:用户、房间、时间、预订 用户: CREATE TABLE IF NOT EXISTS users ( apartmentNumber varchar(4) NOT NULL, surname varchar(50) NOT

我试图编写一个查询,从四个表中获取信息,但我无法理解它。有人能帮我做些指导吗

模型是用户可以在指定的时间段内预订房间。我想检索未来七天的最新数据,所以我使用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');
在添加times表之前(与之前在bookings表中的时间相同),我通过以下查询获得了数据:

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;
但它应该包括2009年11月23日的两次预订

我迷路了。。。如有任何意见,将不胜感激。谢谢

/Anders

您对WEEK()函数的使用将事情限制在本周,而2009-11-23将在下周进行。这与您的声明不符

检索当前的数据 接下来的七天

我还没有完全分析您的查询,但我认为您应该尝试将DATEDIFF()函数的范围从(-10,1)更改为(-10,7),并完全删除WEEK

以下是一些附带评论:

  • 您应该使用更现代的连接语法,它更易于阅读
  • 使用BETWEEN表示您的日期范围
  • 您对WEEK()函数的使用将时间限制在本周,2009-11-23将在下周发布。这与您的声明不符

    检索当前的数据 接下来的七天

    我还没有完全分析您的查询,但我认为您应该尝试将DATEDIFF()函数的范围从(-10,1)更改为(-10,7),并完全删除WEEK

    以下是一些附带评论:

  • 您应该使用更现代的连接语法,它更易于阅读
  • 使用BETWEEN表示您的日期范围

  • 使用WEEK()的问题在于,它提供了一个固定的7天窗口,而不是一个滑动的7天窗口,这似乎是您所需要的。试试这个:

    SELECT users.surname, users.apartmentNumber, rooms.name as room, bookings.date, times.start, times.stop
    FROM bookings, rooms, users, times
    WHERE bookings.date >= CURDATE()
    AND bookings.date <= DATE_ADD(CURDATE(), INTERVAL 7 DAY)
    AND users.apartmentNumber = bookings.user
    AND bookings.room = rooms.id
    AND times.id = bookings.time
    ORDER BY room, bookings.time, bookings.date ASC;
    
    选择users.name、users.apartmentNumber、rooms.name作为房间、bookings.date、times.start、times.stop
    来自预订、房间、用户、时间
    其中bookings.date>=CURDATE()
    
    和bookings.date,而不是>=或间隔8天)。

    使用WEEK()的问题是,它提供了一个固定的7天窗口,而不是一个滑动的7天窗口,这似乎是您所需要的。试试这个:

    SELECT users.surname, users.apartmentNumber, rooms.name as room, bookings.date, times.start, times.stop
    FROM bookings, rooms, users, times
    WHERE bookings.date >= CURDATE()
    AND bookings.date <= DATE_ADD(CURDATE(), INTERVAL 7 DAY)
    AND users.apartmentNumber = bookings.user
    AND bookings.room = rooms.id
    AND times.id = bookings.time
    ORDER BY room, bookings.time, bookings.date ASC;
    
    选择users.name、users.apartmentNumber、rooms.name作为房间、bookings.date、times.start、times.stop
    来自预订、房间、用户、时间
    其中bookings.date>=CURDATE()
    和bookings.date,而不是>=或间隔8天)

    SELECT users.surname, users.apartmentNumber, rooms.name as room, bookings.date, times.start, times.stop
    FROM bookings, rooms, users, times
    WHERE bookings.date >= CURDATE()
    AND bookings.date <= DATE_ADD(CURDATE(), INTERVAL 7 DAY)
    AND users.apartmentNumber = bookings.user
    AND bookings.room = rooms.id
    AND times.id = bookings.time
    ORDER BY room, bookings.time, bookings.date ASC;