磕了一个季度的MySQL,竟然被这道SQL题给搞崩了
明天敌人在群里发了一个SQL题,我蒙圈了,半天没思路。我磕了整个Q2的MySQL,看各种索引优化、MVCC、锁、B+树,此时心里就只有”花里胡哨,心里没点B树?“
题目:
有一张表b字段包含:用户id,年,月,请查问在2020年每个月都有记录的用户id?且不探讨有没有什么场景会用到这样的一张表以及其合理性。请用SQL实现上边的问题
我看到的时候,第一个想到的就是用group by
select user_id from b where year=2020 group by user_id having count(month)=12;没有建表测试,本人也不确定对不对
依照平时写业务代码的思维,获取每个月都有哪些用户id,而后取交加,发现走不通啊【手动捂脸】
那就一步一步来,如果晓得一个SQL执行每一步的过程是什么样的,那还会有难写的SQL?
之前整顿过一篇SQL执行原理的文章,有趣味的能够看一下:SQL查问执行程序详解
创立一个测试表,构造如下:
CREATE TABLE `b` ( `user_id` int(11) NOT NULL, `month` int(10) DEFAULT NULL, `year` int(10) DEFAULT NULL) ENGINE=InnoDB DEFAULT CHARSET=latin1;而后造一些测试数据:
insert into b values(1,1,2020),(1,2,2020),(1,3,2020),(1,4,2020),(1,5,2020),(1,6,2020),(1,7,2020),(1,8,2020),(1,9,2020),(1,10,2020),(1,11,2020),(1,12,2020),(1,1,2020);insert into b values(2,1,2020),(2,2,2020),(2,3,2020),(2,4,2020),(2,5,2020),(2,6,2020),(2,7,2020),(2,8,2020),(2,9,2020),(2,10,2020),(2,11,2020),(2,12,2020);insert into b values(6,1,2020),(6,2,2020),(6,3,2020),(6,4,2020),(6,5,2020),(6,6,2020),(6,7,2020),(6,8,2020),(6,9,2020),(6,10,2020),(6,11,2020),(6,12,2020);insert into b values(10,1,2020),(10,2,2020),(10,3,2020),(10,4,2020),(10,5,2020),(10,6,2020),(10,7,2020),(10,8,2020),(10,9,2020),(10,10,2020),(10,11,2020),(10,12,2020);insert into b values(25,1,2020),(25,2,2020),(25,3,2020),(25,4,2020),(25,5,2020),(25,6,2020),(25,7,2020),(25,8,2020),(25,9,2020),(25,10,2020),(25,11,2020),(25,12,2020);insert into b values(66,1,2020),(66,2,2020),(66,6,2020),(66,4,2020),(66,5,2020),(66,6,2020),(66,7,2020),(66,8,2020),(66,9,2020),(66,10,2020),(66,11,2020),(66,12,2020);insert into b values(7,1,2020),(7,2,2020),(7,4,2020),(7,5,2020),(7,7,2020),(7,9,2020),(7,10,2020),(7,11,2020);insert into b values(12,1,2020),(12,4,2020),(12,5,2020),(12,7,2020),(12,9,2020),(12,10,2020),(12,11,2020);insert into b values(12,1,2019),(12,4,2019),(12,5,2019),(12,7,2019),(12,9,2019),(12,10,2019),(12,11,2019);第一步,先从简略的开始,我就先查进去year为2020的,然而,因为可能会有反复数据,所以我顺便去重
...