You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.21 22:39:20