• 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
      );
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    插入数据
    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');
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    解答
    -- 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'即可
     -- 解题思路:将连续未预订进行标记,再从中找出满足条件的内容
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    解题思路

    将连续未预订进行标记,再从中找出满足条件的内容

  • 相关阅读:
    ensp无线WLAN和无缝漫游出现问题
    vscode 清除全部的console.log
    英语复习-10.22
    Mybatis Plus分页实现逻辑整理(结合芋道整合进行解析)
    【D3.js】1.19-给 D3 元素添加悬停效果
    three.js销毁物体(对象)
    [李宏毅老师深度学习视频] BERT介绍
    【数据结构】String类对象的创建与字符串常量池的“神秘交易”
    派金SDK接入文档
    antd 表格getCheckboxProps禁用
  • 原文地址:https://blog.csdn.net/qq_42765393/article/details/125507338