Hello 大家好,我是阿粉,作为 Java 工程师,数据库用的最多的肯定是 MySQL,而对于 MySQL 公号前面也发过很多文章,感兴趣的可以去翻翻。今天阿粉主要是想通过 LeetCode 上面的一个题目来再带大家看看 MySQL 的变量使用以及通过 Explain 的解析看看SQL 的执行过程。虽然平时在工作中对于 MySQL 使用的很多,但是相对于 MySQL 的变量使用相对还是较少的,所以阿粉在刚看到的时候还是有点懵的,不过我相信大家肯定不会像阿粉一样,毕竟能关注我们公众号的读者都是优秀的。
题目
题目描述:编写一个 SQL 查询,查找所有至少连续出现三次的数字。并且给了一个示例,阿粉按照题目给的示例在本地创建了 Logs 表和插入相应的数据,如下:
我们可以看到在给定上面的 Logs 表中, 1 是唯一连续出现至少三次的数字,所以最后输出的结果是 1。
原始题目:LeetCode 180
刚看到题目的时候,阿粉一瞬间还是没反应过来,不知道该如何着手进行,思索了一下考虑是否可以用自连接来实现呢?然后根据题目的意思就写出了如下的 SQL。
SELECT DISTINCT l1.num FROM `Logs` l1, `Logs` l2, `Logs` l3 WHERE l1.num = l2.num AND l2.num = l3.num AND l1.id = l2.id - 1 AND l2.id = l3.id - 1
写完过后阿粉第一次提交,提示下面错误,可以看到是最后没有将返回重命名,调整了一下 SQL,就l1.num
改成l1.num as ConsecutiveNums
再次提交,得到的第二张通过的图。
看开始看到通过,阿粉还在想这道题也没什么啊,还是 so easy 的嘛。但是突然阿粉转念一想,这个题目说的是连续出现,并没有说 ID 是连续的啊,如果 ID 不连续的话,这种就不对了,还有就是如果需要连续 4 次出现的,5 次出现的数字呢?总不能一直自连接下去吧。如果写成这样那整个 SQL 就太不灵活了。
随后阿粉就看了一下官方解答以及相关评论,果不其然虽然官方给出的解答跟阿粉的一致,但是下面的评论却有很多小伙伴都在说这个 ID 不连续的问题。
既然反馈这种做法有问题,那自然就会有好事之者会想到解决办法,果然评论区的一个大佬给出了下面的这种解法
刚看到这个解法的时候,阿粉一下子没有看懂,把这个代码进行了提交,果然也是正常的通过了。而且这种解法不会被出现几次的条件给限制。抱着学习的心态,阿粉准备研究一下这条 SQL 里面的内容。