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即可 -- 解题思路:将连续未预订进行标记,再从中找出满足条件的内容
解题思路
将连续未预订进行标记,再从中找出满足条件的内容
