2017-04-08 88 views
1

这里可提供座位是我的数据库:SQL数据库:显示每个筛选

CREATE TABLE customer (
    id INT AUTO_INCREMENT, 
    email VARCHAR(64) NOT NULL, 
    password VARCHAR(32) NOT NULL, 
    PRIMARY KEY (id) 
) ENGINE = InnoDB; 

CREATE TABLE movie (
    id INT AUTO_INCREMENT, 
    title VARCHAR(64) NOT NULL, 
    runtime TIME NOT NULL, 
    certificate ENUM('U', 'PG', '12', '15', '18') NOT NULL, 
    PRIMARY KEY (id) 
) ENGINE = InnoDB; 

CREATE TABLE room (
    id INT AUTO_INCREMENT, 
    roomNo ENUM ('Screen 1', 'Screen 2', 'Screen 3', 'Screen 4', 'Screen 5') NOT NULL, 
    PRIMARY KEY (id) 
) ENGINE = InnoDB; 

CREATE TABLE seat (
    id INT AUTO_INCREMENT, 
    row ENUM('A', 'B', 'C', 'D', 'E', 'F') NOT NULL, 
    num ENUM('1', '2', '3', '4', '5', '6', '7', '8', '9', '10') NOT NULL, 
    roomID INT, 
    PRIMARY KEY (id), 
    FOREIGN KEY (roomID) 
     REFERENCES room (id) 
) ENGINE = InnoDB; 

CREATE TABLE screening (
    id INT AUTO_INCREMENT, 
    movieID INT, 
    movieDate DATE NOT NULL, 
    movieTime TIME NOT NULL, 
    roomID INT, 
    PRIMARY KEY (id), 
    FOREIGN KEY (movieID) 
     REFERENCES movie (id), 
    FOREIGN KEY (roomID) 
     REFERENCES room (id) 
) ENGINE = InnoDB; 

CREATE TABLE booking (
    id INT AUTO_INCREMENT, 
    customerID INT, 
    screeningID INT, 
    seatID INT, 
    PRIMARY KEY (id), 
    FOREIGN KEY (customerID) 
     REFERENCES customer(id), 
    FOREIGN KEY (screeningID) 
     REFERENCES screening (id), 
    FOREIGN KEY (seatID) 
     REFERENCES seat (id) 
) ENGINE = InnoDB; 

这是我使用的查询:

SELECT s.id, s.row, s.num, s.roomID 
FROM seat s 
INNER JOIN screening scr 
ON scr.roomID = s.roomID 
LEFT JOIN booking b 
ON s.id = b.seatID 
WHERE b.seatID IS NULL AND scr.id = 6 

所以我的问题是,对筛查ID = 2, roomID是1(意思是屏幕1)。说一个预订了seatID'1'的客户,这意味着行A,筛选1的座位编号为1.当我运行此查询以显示另一个筛选标识的可用座位,其中例如6和房间相同(筛选1)时,它会显示除了seatID 1以外的所有座位,这是由另一位客户预订的。

我想要的是每个放映都有自己的座位,问题在于它对于每个房间。因此,如果另一个放映(电影)恰巧使用同一个房间,它将与另一个使用相同房间的放映相冲突。

+0

添加了MySQL标签。 –

+0

哇!我读过全文。 –

+0

*谢谢*表格创建脚本。为了测试我们的答案,是否可以添加一些表格填充脚本? – toonice

回答

1

下应该给你提供的所有SeatsScreening用的sentinelValueid列表...

SELECT id AS seatID 
FROM seat 
WHERE roomID = (SELECT roomID 
       FROM screening 
       WHERE screeningID = sentinelValue) 
    AND id NOT IN (SELECT seatID 
        FROM booking 
        WHERE screeningID = sentinelValue); 

我的逻辑是如下...

要确定哪些Seats是我们必须首先知道什么Seats最初可用于该Screening,即什么Seats分配给Room被分配到Screening

为此,我们从已知的值screening.id/screeningID开始,我将其称为sentinelValue

有了这个已知值我们可以判断使用以下SQL的screening相关的room.id/roomID ...

SELECT roomID 
FROM screening 
WHERE screeningID = sentinelValue 

数据库只有明确记录其seatsbookedscreening,但不明确记录哪个seats不是booked。幸运的是,我们不能booked(即是可用的)由bookedseats列表比较分配给screeningseats的完整列表,这是seats分配给room名单推断出seats是。

为了得到黄牌警告seats我用下面的SQL列表...

SELECT seatID 
FROM booking 
WHERE screeningID = sentinelValue 

然后所有需要做的是让那些NOT尚未booked分配给screening'sroomseats名单。为此,我使用了我的答案开头的SQL。

如果您有任何问题或意见,请随时发布相应评论。

0

我不知道我理解你的问题,但你说:

我想要的是什么每个筛选有它自己的座位

所以,我只想做一个查询与基于该roomID筛选和座椅之间的连接:

select B.id as SeatID 
,B.row as SeatRow 
,B.num as SeatNum 
,A.roomID as RoomID 
, A.id as ScreeningID 
from screening A 
inner join seat B on A.roomID=B.roomID 

这将返回你的数据集与一个记录每座和每个筛选