【发布时间】:2021-05-12 01:57:45
【问题描述】:
该域是一个航空公司预订系统。用户可以预订航班。航班由一条或多条航段组成。
┌─────┐ ┌──────┐ ┌───────┐
│ Leg ├────────┤Flight├──────┤Booking│
└─────┘ * * └──────┘1 * └───────┘
要向用户显示有效航班的列表,系统必须确定航班是否有空余座位。最大可用席位存储为Leg 表中的字段。预订座位存储在Booking。
航班可能包含多个航段。例如,可能有 3 个航段 A -> B -> C。还有两个应该由用户预订的航班:
- A -> B:从 A 到 B 的航班。
- A -> B -> C:从 A 经 B 飞到 C。
我创建了一个dbfiddle,尝试按航段分组,这为我提供了每条航段的预订座位数。但我需要生成每段预订乘客数量最多的航班列表。在上面的示例中:如果乘客预订了航班 2,则航班 1 的可用座位可能会更少,因为他们都“共享”第一段航程。
select l.id as Leg, sum(b.number_passengers) as BookedSeats
FROM flight f
JOIN flight_legs fl on f.id = fl.flight_id
JOIN leg l on fl.legs_id = l.id
JOIN booking b on f.id = b.flight_id
GROUP BY l.id;
如何创建有可用座位的航班列表?
示例
架构
腿| id | seats_available |
|---|---|
| 1 | 2 |
| 2 | 2 |
| id |
|---|
| 1 |
| 2 |
| flight_id | leg_id | legs_order |
|---|---|---|
| 1 | 1 | 0 |
| 1 | 2 | 1 |
| 2 | 1 | 0 |
注意:航班 1 有两条腿,航班 2 只有一条腿。两个航班“共享”同一个第一站。
预订| id | flight_id | number_passengers |
|---|---|---|
| 1 | 1 | 1 |
| 2 | 2 | 1 |
注意:一个人预订了 1 号航班并且双腿飞行。另一个人只预订了第一程航班 2。这意味着,第一段有两名乘客,另一段有一名乘客。
预期输出
查找所有有可用座位的航班。座位也可能被其他航班的航段占用。
| flight_id | free_seats |
|---|---|
| 1 | 0 |
| 2 | 0 |
注意:航班 2 没有空位,因为第一段已经订满了
ER 图
【问题讨论】:
-
如果可能,输入您想要的输出和样本数据
-
@LucasEthen 添加了对 dbfiddle 示例的说明。