leetcode练习题-mysql:180. 连续出现的数字

8 篇文章 1 订阅
8 篇文章 0 订阅

编写一个 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的原理最近买了本小册在看,等看完我应该就知道原因了,到时候会再回来做个解释。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值