一、NineData第二届数据库编程大赛
用一条SQL秒杀火车票,大赛官网地址:
二、代码工作原理概述
该脚本实现了为列车和乘客匹配座位或无座标识的功能,通过逐步处理和整合列车及乘客数据,完成复杂的分配任务。
1. 初始化变量
程序中用两个变量(@current_train_id 和 @current_seat_count)动态记录当前列车的ID和累计的座位编号。它们在计算过程中不断更新,用于乘客和列车的关联。
2. 数据扩展
脚本首先从列车表中生成两个数据视图:
原始列车数据:包括所有的座位信息,作为正常乘客的分配依据。
无座列车数据:通过将座位数缩减为1/10,表示无座乘客的乘车情况。
这一步为后续处理提供了统一的列车信息基础。
3. 线路汇总
对于每一条线路(起点站和终点站的组合),程序汇总了所有列车的座位数,生成该线路的累计座位编号。这些编号用于统一乘客和列车在每条线路上的编号范围。
4. 列车累计座位编号计算
程序通过对子查询的嵌套,计算每列车在某条线路上的座位起始编号。随后,将这些列车编号与线路的总体编号进行合并,形成完整的线路-列车座位关系。
5. 合并乘客和列车数据
在这一步,乘客信息和列车信息被合并到一个视图中:
乘客数据:按起点和终点分组,并为每位乘客分配累计编号。
列车数据:保留列车的累计座位起始编号和对应线路信息。
通过整合,它形成了一个包含乘客与列车完整信息的统一表。
6. 数据排序
程序按线路(起点和终点)对整合后的数据表进行排序,并按乘客或列车的类别(mytype)进一步区分优先级。排序的结果便于后续逐步为乘客分配列车信息。
7. 分配座位和列车信息
通过循环更新变量,程序为每位乘客动态分配:
列车编号:记录当前乘客被分配到的列车。
座位编号:通过计算座位相对位置为乘客分配具体的座位编号或无座标识。
这种动态分配机制确保了每条线路上的所有乘客都能与列车数据正确关联。
8. 计算座位细节
程序进一步细分座位编号,计算出每位乘客的:
车厢号:按每100个座位分配一个车厢。
行号:按每行5个座位分