题目
表:Stadium
编写一个 SQL 查询以找出每行的人数大于或等于 100 且 id 连续的三行或更多行记录。
返回按 visit_date 升序排列 的结果表。
查询结果格式如下所示。
示例 1:
解题思路
前置知识
自然连接
自连接可以理解为自己连接自己,在一张表上面所进行的操作;将一张表分成两张结构和数据完全一样的表(简单理解:相当于克隆了一张跟自己长得一模一样的表);
例如:我们对这张表进行隐式连接
select * from tb_goods as g1,tb_goods as g2;
查询结果如下:它会列出每条数据的组合情况,如下,每一种牙刷都能组成四种组合。
知道了隐式连接后让我们来解决一下这个问题
1.题目要求我们查找每行的人数大于或等于 100 且 id 连续的三行或更多行记录,只要看到连续几行我们就可以考虑利用多表联合查询。
2.首先我们将表进行联合,联合条件为
((a.id = b.id-1 and b.id = c.id-1)or
(a.id = b.id+1 and a.id = c.id-1)or
(a.id = b.id+1 and b.id = c.id+1))
也就是我们考虑了三种情况
a 表的id为第一的、a 表的id为第二的、a 表的id为第三的
并且,三张表的 people 均要大于100,此时我们筛选出来的还可能存在重复的元素,所以我们要利用 distinct 进行去重,返回对 a 表进行升序排序后的 a 表即可。
代码实现
select distinct a.* from stadium a,stadium b,stadium c
where a.people>=100 and b.people>=100 and c.people>=100
and((a.id = b.id-1 and b.id = c.id-1)or
(a.id = b.id+1 and a.id = c.id-1)or
(a.id = b.id+1 and b.id = c.id+1))
order by a.id
测试结果