sql题一(空位连续座位买票)

sql题一

题目: 所需文件 ROWID(座位排号)、SEAT(座位编号)、STATUS(状态) 题目要求 4 个人一起去看电影,准备预订电影票横向坐一起,从这么多排座位中,找出连续 4个空位的全部组合,结果输出座位组合情况,例 (1~4 6~9) 思考一下如果是N个人的话应该如何解决,是否有一套通用的查询语句来完成题目。

使用您自己擅长的数据库即可,写sql时候,注明数据库及版本。 要求:写出sql,并写明解题思路
创建表
DROP TABLE IF EXISTS `2003a`;

CREATE TABLE `2003a`  (

  `seat` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL,

  `status` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL,

  `rowid` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL
  );
插入数据
INSERT INTO `2003a` VALUES (1, 未预订, A);
INSERT INTO `2003a` VALUES (2, 已预订, A);
INSERT INTO `2003a` VALUES (3, 未预订, A);
INSERT INTO `2003a` VALUES (4, 未预订, A);
INSERT INTO `2003a` VALUES (5, 未预订, A);
INSERT INTO `2003a` VALUES (6, 已预订, B);
INSERT INTO `2003a` VALUES (7, 未预订, B);
INSERT INTO `2003a` VALUES (8, 未预订, B);
INSERT INTO `2003a` VALUES (9, 未预订, B);
INSERT INTO `2003a` VALUES (10, 未预订, B);
INSERT INTO `2003a` VALUES (11, 未预订, C);
INSERT INTO `2003a` VALUES (12, 已预订, C);
INSERT INTO `2003a` VALUES (13, 已预订, C);
INSERT INTO `2003a` VALUES (14, 未预订, C);
INSERT INTO `2003a` VALUES (15, 未预订, C);
INSERT INTO `2003a` VALUES (16, 未预订, D);
INSERT INTO `2003a` VALUES (17, 未预订, D);
INSERT INTO `2003a` VALUES (18, 未预订, D);
INSERT INTO `2003a` VALUES (19, 未预订, D);
INSERT INTO `2003a` VALUES (20, 已预订, D);
解答
-- mysql 8.0
select concat(seat-3,"~",seat) as 可选择座位from(
select *,
(case STATUS 
when 未预订 then @num := @num+1
when 已预订 then @num := 0
end
 ) as num
 from 2003a,(select @num := 0) as r1) as r2
 where r2.num>=4 and rowid =(select rowid from 2003a r3 where seat=r2.seat-3);
 -- 当人数是n个人时,只需要将两处seat-3改为(seat-(n-1))和num>4改为num>n即可
 -- 解题思路:将连续未预订进行标记,再从中找出满足条件的内容
解题思路
将连续未预订进行标记,再从中找出满足条件的内容
经验分享 程序员 微信小程序 职场和发展