如何在MySQL中生成重复16次的1、2、3循环数字序列?
MySQL生成重复16次的1-3循环序列
需求:生成1、2、3循环重复16次的数字序列,总计48行数据。
原SQL问题分析
你提供的SQL语句逻辑错误,无法生成目标序列:
select (t*16+1) x from (select 0 t union select 1 union select 2 ) A , (select 0 u union select 1 union select 2 )B order by x;
该语句通过两个3行子查询的笛卡尔积得到9行数据,计算t*16+1仅会输出1、17、33这三个值的重复,完全不符合循环序列的需求。
正确解法
方法1:递归CTE(MySQL 8.0及以上版本)
利用递归CTE实现循环计数,自动重置序列并控制循环次数:
WITH RECURSIVE seq AS ( SELECT 1 AS num, 1 AS cycle_count UNION ALL SELECT CASE WHEN num = 3 THEN 1 ELSE num + 1 END, CASE WHEN num = 3 THEN cycle_count + 1 ELSE cycle_count END FROM seq WHERE cycle_count <= 16 ) SELECT num FROM seq WHERE cycle_count <= 16;
方法2:笛卡尔积+取模运算(兼容MySQL 5.x及以上版本)
通过生成连续数字,对3取模后偏移得到循环序列:
SELECT MOD(t, 3) + 1 AS num FROM ( -- 生成0到47的连续数字(共48行,对应16次循环) SELECT a.t + b.t*3 + c.t*9 + d.t*27 AS t FROM (SELECT 0 t UNION SELECT 1 UNION SELECT 2) a, (SELECT 0 t UNION SELECT 1 UNION SELECT 2) b, (SELECT 0 t UNION SELECT 1 UNION SELECT 2) c, (SELECT 0 t UNION SELECT 1) d ) AS nums WHERE t < 48;
方法3:直接笛卡尔积(直观易懂,兼容所有版本)
将基础序列与16行的重复表做笛卡尔积,直接生成目标序列:
SELECT num FROM ( SELECT 1 AS num UNION ALL SELECT 2 UNION ALL SELECT 3 ) base_seq CROSS JOIN ( -- 生成16行数据,控制循环次数 SELECT 1 AS n UNION ALL SELECT 2 UNION ALL SELECT 3 UNION ALL SELECT 4 UNION ALL SELECT 5 UNION ALL SELECT 6 UNION ALL SELECT 7 UNION ALL SELECT 8 UNION ALL SELECT 9 UNION ALL SELECT 10 UNION ALL SELECT 11 UNION ALL SELECT 12 UNION ALL SELECT 13 UNION ALL SELECT 14 UNION ALL SELECT 15 UNION ALL SELECT 16 ) repeat_times;
内容的提问来源于stack exchange,提问作者Mithilesh Kumar
相关产品推荐
相关产品推荐

