❤️博客主页: 楚生辉
❤️系列专栏:【LeetCode刷题】
❤️一句短话: 坚持不懈,孜孜不倦
1.题目描述
表: Cinema
+-------------+------+
| Column Name | Type |
+-------------+------+
| seat_id | int |
| free | bool |
+-------------+------+
Seat_id是该表的自动递增主键列。
该表的每一行表示第i个座位是否空闲。1表示空闲,0表示被占用。
编写一个SQL查询来报告电影院所有连续可用的座位。
返回按 seat_id 升序排序 的结果表。
测试用例的生成使得两个以上的座位连续可用。
查询结果格式如下所示。
输入:
Cinema 表:
+---------+------+
| seat_id | free |
+---------+------+
| 1 | 1 |
| 2 | 0 |
| 3 | 1 |
| 4 | 1 |
| 5 | 1 |
+---------+------+
输出:
+---------+
| seat_id |
+---------+
| 3 |
| 4 |
| 5 |
+---------+
2.代码实现
通过自连接先筛选出靠近的座位所有的座位使用情况
ㅤㅤㅤㅤㅤㅤㅤㅤㅤㅤㅤㅤ
然后进行判断,只要本身的数据是1,且附近有一个座位是1的,就符合要求,筛选出符合要求的座位id,也即就表示为连续的座次
SELECT DISTINCT
( t1.seat_id )
FROM
Cinema t1,
Cinema t2
WHERE
abs( t1.seat_id - t2.seat_id ) = 1
AND t1.free = 1
AND t2.free = 1
ORDER BY
t1.seat_id
- 解释
2的旁白是1与3,而2本身就有人因此排除
3的旁边是2与4,2有人,而4没有人,满足只要有一个同时为1的条件,因此3是符合要求的
4的旁白是3与5,3无人,5无人,因此符合
5的旁边只有4,4与5同时无人,因此也符合
ㅤㅤㅤㅤㅤㅤㅤㅤㅤㅤㅤㅤㅤㅤ
3.总结
像这种表格简单,关键词连接,我们多采用自连接的方式去解决问题