SQL语句练习二

2021-08-06 13:26:14 浏览数 (2)

大家好,从今天开始个人公众号也开启每日刷题的文章了。每日都会分享一道数据库相关的练习试题。题目可能很简单,也可能很难。

在每天的试题中,都会记录个人的解题思路。如果你有好的解题思路,也可以评论留言。如果存在不足的地方,也欢迎指正。

题目描述:

几个朋友来到电影院的售票处,准备预约连续空余座位。你能利用表 cinema ,帮他们写一个查询语句,获取所有空余座位,并将它们按照 seat_id 排序后返回。

代码语言:javascript复制
| seat_id | free |
|---------|------|
| 1       | 1    |
| 2       | 0    |
| 3       | 1    |
| 4       | 1    |
| 5       | 1    |

对于如上样例,你的查询语句应该返回如下结果。

代码语言:javascript复制
| seat_id |
|---------|
| 3       |
| 4       |
| 5       |

seat_id 字段是一个自增的整数,free 字段是布尔类型('1' 表示空余, '0' 表示已被占据)。连续空余座位的定义是大于等于 2 个连续空余的座位。

解题思路

解决此题的关键在于,连续并且是空位的。从题干中很简单的能看出,空位都是用1表示,我们只需要查询出free字段是1的即可。难点在于连续的情况如何查询,由于题中提及到,只要是2个连续的编号(seat_id)就代表是连续的,从这一点就可以得出如下示例图:

此图的表示含义如下:

假设,编号为1的位置可选,这时候,第二个位置可以是编号为1,2,3,4,5的。

假设,编号为2的位置可选,这时候,第二个位置可以是编号为1,2,3,4,5的。

。。。。。。

假设,编号为5的位置可选,这时候,第二个位置可以是编号为1,2,3,4,5的。这样我们就不难想到这是一种笛卡尔积的计算方式,我们这里使用连表查询,得出笛卡尔积数据,在根据free是1的数据即可。

解答方法

代码语言:javascript复制
select distinct a.seat_id
from cinema a join cinema b
  on abs(a.seat_id - b.seat_id) = 1
  and a.free = 1 and b.free = 1
order by a.seat_id;

0 人点赞