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