1

入力した時間に利用できるかどうかを確認するデータベースを作成していますRoom。そして、クエリの作成に問題があります。入力された時間と重複する場合、クエリはScheduleテーブルとテーブルをチェックする必要があります。オーバーラップがある場合とない場合にReservationクエリが返すのが最善です。これはそのための適切なデータベース構造ですか (クエリのみに集中できます)、またはデータベースを再構築する必要がありますか? 私を助けてください。TRUEFALSE

私のデータベース:

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
)
4

1 に答える 1

2

各列に適切なデータ型を選択します。「ID」列はより適切ですINT。「日」列は何のために必要ですか? とにかく、「start_time」列と「end_time」列に日付があります。

また、"Room" テーブルと他の 2 つのテーブルの間に関連性が見られません。

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 がわからないので、正しい構文もわかりませんが、Room テーブルの id 列を参照する Schedule テーブルと Reservation テーブルの 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 を返します。

于 2012-06-11T15:03:45.017 に答える