题目链接:点击打开链接
题目大意:略。
解题思路:
- 解决方案(1):自定义变量,这里有个小技巧,写变量表达式的时候,不要写在一行,把从左到右转换成从上到下的顺序来看会比较好理解;"IF(@n=num, NULL, @cnt:=1)" 这一句比较关键,这里的 NULL 是真的为了满足表达式而已,没啥卵用,主要是为了不相等的时候初始化数据罢了
- 解决方案(2):自连接,"l1.Id = l2.Id - 1 AND l2.Id = l3.Id - 1" 估计这一句比较难理解,意思是 "l1.Id + 1 = l2.Id AND l2.Id + 1 = l3.Id" 这样看是不是小伙伴恍然大悟了呢~
AC 代码
-- 解决方案(1)
SELECT DISTINCT rs.num AS ConsecutiveNums
FROM (SELECT
num,
IF(@n=num, NULL, @cnt:=1),
@cnt:=IF(@n=num, @cnt+1, @cnt) AS `cnt`,
@n:=num
FROM Logs, (SELECT @cnt:=1, @n:=NULL) init) rs
WHERE rs.cnt>=3
-- 解决方案(2)
SELECT DISTINCT
l1.Num AS ConsecutiveNums
FROM
Logs l1,
Logs l2,
Logs l3
WHERE
l1.Id = l2.Id - 1
AND l2.Id = l3.Id - 1
AND l1.Num = l2.Num
AND l2.Num = l3.Num
;