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

标签 mysql join datediff

我正在尝试编写一个从四个表中获取信息的查询,但我无法弄清楚。有人可以帮我提供一些指导吗?

模型是用户可以预订指定时间段的房间。我想检索 future 7 天的最新数据,因此我使用 WEEK 和 DATEDIFF。 DATEDIFF 是为了确保我不会取回 future 或一年多以前发生的任何房间预订。我有四个表:users、rooms、times、bookings

用户:

  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

但它应该包括 2009-11-23 的两个预订

我迷路了...任何意见将不胜感激。谢谢!

/安德斯

最佳答案

您对 WEEK() 函数的使用将事情限制在本周,而 2009 年 11 月 23 日在下周。这与您声明的不兼容

retrieve the data that is current for the next seven days

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

一些旁注:

  1. 您应该使用更现代的 JOIN 语法,它更易于阅读
  2. 使用 BETWEEN 表达您的日期范围

关于MySQL 连接四个表并使用 WEEK 和 DATEDIFF 获取当前数据?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1767913/

相关文章:

mysql - SQL Error : 1054, SQLState : 42S22 , Spring Boot jpa 应用程序中 'NaN' 中的未知列 'field list'

php - 如果存在则关联

mysql - 我必须使用连接表吗? [MYSQL]

php - php中的日期差异?

mysql - 试图在 MySQL 中查找两个日期之间的小时差异

mysql - 计算 30 天 bin 中的行数

sql - Mysql 使用 JOIN 和 WHERE 语句。这是什么区别?

MySQL按值选择计数

mysql - mysql 加入帮助

python - 了解 pandas merge 中的 "left_index"和 "right_index"参数