题目
表:student
Column Name | Type |
---|---|
id | int |
num | varchar |
id 是这个表的主键。
编写一个 SQL 查询,查找所有至少连续出现三次的数字。
返回的结果表中的数据可以按 任意顺序 排列。
查询结果格式如下面的例子所示:
student 表:
Id | Num |
---|---|
1 | 1 |
2 | 1 |
3 | 1 |
4 | 2 |
5 | 1 |
6 | 2 |
7 | 2 |
Result 表:
ConsecutiveNums |
---|
1 |
1 是唯一连续出现至少三次的数字。
解析
思路
我们想要连续的3个num值都一样的,那么我们可以自连接2次,那么就是三张表,第一张表,从id为1开始,第二张表,id为2开始,第三张表,id为3开始,那么在用表1的num= 表2的num,表2的num=表3的num,便可以得到连续3个num值都一样的数,如果要连续4个,那就自连接3次,4张表,以此类推,如果要将num值去重,那就加DISTINCT
自连接
自连接2次,为三张表
SELECT *
FROM
student l1,
student l2,
student l3
结果共343条数据:7x7x7=343
加条件筛选
SELECT *
FROM
student l1,
student l2,
student l3
WHERE
l1.Id = l2.Id - 1 ---第一个条件
AND l2.Id = l3.Id -1 ---第二个条件
第一个条件结果为42条
二个条件结果为5条
为什么会是5条呢,原先是343条(笛卡儿积)
经过第一个条件变为了42条,因为l1.id总共为7个,经过等值运算之后,得出结果为6个,l1表的id为1-6,l2表的id为2-7,去掉了i2表id为1的数据,但是我们还有表3做笛卡儿积运算,6x7=42,则为42条数据
经过第一个条件的拆选之后,l2.id总数为6个,按此基础之上做与l3.id - 1等值运算,得到结果为5个
得到最后的值
SELECT l1.num AS ConsecutiveNums
FROM
student l1,
student l2,
student l3
WHERE
l1.Id = l2.Id - 1
AND l2.Id = l3.Id -1
AND l1.num = l2.num
AND l2.num = l3.num
加上l1.num = l2.num AND l2.num = l3.num 变可以确定我们想要的哪一行数据,select 做返回字段的筛选,则可以得到我们想要的数据
ps:我们还要注意,要加上DISTINCT去重关键字,因为如果数据是一下的情况,会出现重复的值