大家好,从今天开始个人公众号也开启每日刷题的文章了。每日都会分享一道数据库相关的练习试题。题目可能很简单,也可能很难。
在每天的试题中,都会记录个人的解题思路。如果你有好的解题思路,也可以评论留言。如果存在不足的地方,也欢迎指正。
题目描述:
几个朋友来到电影院的售票处,准备预约连续空余座位。你能利用表 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;