SQL数据库:显示每次筛选的可用席位

时间:2017-04-08 07:54:29

标签: mysql sql movie

这是我的数据库:

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

这是我使用的查询:

.allowedUnits

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

我想要的是每次放映都有自己的座位,问题在于它适用于每个房间。因此,如果另一个放映(电影)碰巧使用同一个房间,它也会与使用同一个房间的另一个放映相撞。

2 个答案:

答案 0 :(得分:1)

以下内容应该为您提供Seats的所有Screening列表,id sentinelValue ...

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仍适用于某个Screening,我们必须首先了解Seats最初可用的Screening,即Seats被分配给分配给Room的{​​{1}}。

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

使用此已知值,我们可以使用以下SQL确定与sentinelValue关联的room.id / roomID ...

screening

数据库仅显式记录SELECT roomID FROM screening WHERE screeningID = sentinelValue seatsbooked的{​​{1}},但未明确记录哪些screening不是seats。幸运的是,我们可以通过将booked seats的列表与分配给该booked booked的完整列表进行比较,推断出哪些seats不是seats(即可用) screening,这是分配给seats的{​​{1}}列表。

要获取已预订room的列表,我使用了以下SQL ...

seats

然后,所有需要做的就是将SELECT seatID FROM booking WHERE screeningID = sentinelValue 的{​​{1}}列表分配给seats screening's room NOT。为此,我使用了答案开头的SQL。

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

答案 1 :(得分: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

这会返回一个数据集,每个席位和每个筛选一个记录