sql题---连续出现的数字
题目
表:student
id 是这个表的主键。
编写一个 SQL 查询,查找所有至少连续出现三次的数字。
返回的结果表中的数据可以按 任意顺序 排列。
查询结果格式如下面的例子所示:
student 表:
Result 表:
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去重关键字,因为如果数据是一下的情况,会出现重复的值