编写一个 SQL 查询,查找所有至少连续出现三次的数字。
+----+-----+
| Id | Num |
+----+-----+
| 1 | 1 |
| 2 | 1 |
| 3 | 1 |
| 4 | 2 |
| 5 | 1 |
| 6 | 2 |
| 7 | 2 |
+----+-----+
例如,给定上面的 Logs 表, 1 是唯一连续出现至少三次的数字。
+-----------------+
| ConsecutiveNums |
+-----------------+
| 1 |
+-----------------+
思路:
连续3次可以利用id去做事情。因为知道了id是自增的情况下,可以定义三张表,表1的id= 表2的id-1, 表2的id=表3的id-1 这样就获得了三个连续号的结果。 举例
表1的id = 1 num = 1
表2的id = 2 num = 2
表3的id = 3 num = 3
这样就达成了3个连续号的目的 那么接下来只要再达成表1~表3的num值相同的条件, 所以我们有了如下的语句
select 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
提交答案的时候我提示我错误 因为我没去重
所以我们最后对答案做个修饰去重, 有两种方式 1.distinct 字段 ,2.group by 字段
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
select 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 group by l1.Num;
单纯去重distinct会更快,但是leetcode给的结果是group by更快,这个不清楚具体原因。涉及mysql的原理最近买了本小册在看,等看完我应该就知道原因了,到时候会再回来做个解释。