问题来源
今天和同事一起讨论MySQL的相关语句以及性能问题,突然被问到如何使用MySQL语句输出0-5的连续数字。
回答:这太简单了,直接上代码:
SELECT 1 UNION SELECT 2 UNION SELECT 3 UNION SELECT 4 UNION SELECT 5
然后同事又问那要是生成0-24 或者0-1000的数据呢?
回答就是:鹅鹅鹅鹅鹅鹅饿…
程序员的任务就是活到老,学到老!!
经过百度还有其他途径终于得到了一定的解决方案,还是乖乖写下笔记【心里想。。被这个难住了】
首先我们先生成一个1-24的连续数据,方便做一个每日的时间段处理:
SELECT @xi:=@xi+1 as xc from
(SELECT 1 UNION SELECT 2 UNION SELECT 3 UNION SELECT 4 ) xc1,
(SELECT 1 UNION SELECT 2 UNION SELECT 3 UNION SELECT 4 UNION SELECT 5 UNION SELECT 6) xc2,
(SELECT @xi:=0) xc0
运行结果如下:
讲解:其实学过一些编程的童鞋都对内外循环有所了解,那么其实在sql中我们也是可以这样理解的,不要忘了sql也是一门语言哦
首先sql中是通过@加一个参数来声明变量的:【SELECT @xi:=0】 比如这个就是声明了一个变量为0,那之后我们需要做的就是循环,在此之前先写一段Python代码,方便和之后这个更好的理解
for i in range(1,5):
for j in range(1,7):
print(j)
输出结果:就是4次1,2,3,4,5,6
相当于外层执行4次,每次有执行内循环6次,即4*6=24次。好那话不多说我们进入正题
(SELECT 1 UNION SELECT 2 UNION SELECT 3 UNION SELECT 4 ) xc1,
(SELECT 1 UNION SELECT 2 UNION SELECT 3 UNION SELECT 4 UNION SELECT 5 UNION SELECT 6) xc2,
我们可以把这个就可以理解为内外两层循环,xc1为外循环,xc2是内循环,说白了就是共执行4次,每次执行6个,这样就可以实现4*6=24的效果了。
SELECT @xi:=@xi+1 as xc from ****
(SELECT @xi:=0) xc0
这句话的意思就是声明一个变量x为0,让他每次加1,所以输出1-24这几个数字。其实想想也很简单,就是想不到。
如果想生成连续的时间可以这样操作:
SELECT DATE_FORMAT(DATE_SUB(NOW(), INTERVAL xc MONTH), '%Y-%m') as date
FROM (
SELECT @xi:=@xi+1 as xc from
(SELECT 1 UNION SELECT 2 UNION SELECT 3 UNION SELECT 4 ) xc1,
(SELECT 1 UNION SELECT 2 UNION SELECT 3 UNION SELECT 4 UNION SELECT 5 UNION SELECT 6) xc2,
(SELECT @xi:=0) xc0
) xcxc
生成最近的24个月的日期,其他的自己可以模仿的书写。
【注意】:在oracle可以直接根据rownub生成,mysql麻烦一些,需要自定义变量,有机会可以多学习一下Oracle,有时候小的问题才最致命!