我正在创建数据库以检查Room
是否可用于输入时间。我在编写查询时遇到问题。如果与输入的时间重叠,则查询必须检查Schedule
表和Reservation
表。如果存在重叠,则查询返回TRUE
将是最佳的,如果没有,则返回FALSE
。这是一个很好的数据库结构(所以我只关注查询)或者我需要重构数据库?请帮帮我。
我的数据库:
CREATE TABLE "Room" (
"ID" VARCHAR PRIMARY KEY NOT NULL UNIQUE,
"Name" VARCHAR NOT NULL,
"Location" VARCHAR NOT NULL,
"Capacity" INTEGER
)
CREATE TABLE "Schedule" (
"ID" VARCHAR,
"Day" VARCHAR,
"start_time" DATETIME,
"end_time" DATETIME
)
CREATE TABLE "Reservation" (
"ID" VARCHAR PRIMARY KEY NOT NULL,
"Day" VARCHAR NOT NULL,
" start_time " DATETIME NOT NULL,
" end_time " DATETIME NOT NULL,
"User" VARCHAR
)
答案 0 :(得分:2)
为每列选择合适的数据类型,“ID”列最好为INT
。你需要什么“日”专栏?无论如何,你的“start_time”和“end_time”列都有一个日期。
此外,我没有看到“房间”表与其他两个表之间的连接。
CREATE TABLE "Room" (
"ID" INT PRIMARY KEY NOT NULL UNIQUE,
"Name" VARCHAR NOT NULL,
"Location" VARCHAR NOT NULL,
"Capacity" INT
)
CREATE TABLE "Schedule" (
ID INT,
start_time DATETIME,
end_time DATETIME,
room_id INT
)
CREATE TABLE "Reservation" (
"ID" INT PRIMARY KEY NOT NULL,
"start_time " DATETIME NOT NULL,
"end_time " DATETIME NOT NULL,
"User" VARCHAR /*you might want to make this an INT, too, and put the users in an extra table*/
, room_id INT
)
我不知道你正在使用什么DBMS,所以我也不知道正确的语法,但你最好把一个外键放在Schedule表和Room表中引用id列的room_id列中。
然后你这样做:
SELECT
*
FROM
Room
LEFT JOIN Schedule ON Room.id = Schedule.room_id
LEFT JOIN Reservation ON Room.id = Reservation.room_id
WHERE
(
(Schedule.start_time <= $yourStartTime AND Schedule.end_time > $yourEndTime)
OR
(Reservation.start_time <= $yourStartTime AND Reservation.end_time > $yourEndTime)
)
AND Room.id = $yourRoomId
当房间空闲时,此查询返回一些内容,当房间空闲时,此查询返回任何/ NULL。