按照两种模式自动插入具有重复数据的行

Auto insert rows with repeated data, following two patterns

我有一个 table 看起来像这样:

| id  | letter | number |
|-----|--------|--------|
| 1   | a      | 1      |
| 2   | b      | 1      |
| 3   | c      | 1      |
| 4   | d      | 1      |
| 5   | a      | 2      |
| 6   | b      | 2      |
| 7   | c      | 2      |
| 8   | d      | 2      |
| 9   | a      | 3      |
| 10  | b      | 3      |
| 11  | c      | 3      |
| 12  | d      | 3      |
|etc..|        |        |

我正在尝试创建一个 SQL 语句自动填充此模式后的 table 直到 id 456。

所以字母是ABCD ABCD,直到序列结束,4的每个'group'都有一个数字,应该达到114。

我不确定解决此问题的最佳方法是什么,如有任何建议,我们将不胜感激。

如果您有某种数字 table 会有所帮助。这是一种使用 cross join 和一些算术的方法:

select (@rn := @rn + 1) as id, l.letter, (n1 + n2*5 + n3*25) as number
from (select 0 as n union all select 1 as n union all select 2 as n union all select 3 union all select 4
     ) n1 cross join
     (select 0 as n union all select 1 as n union all select 2 as n union all select 3 union all select 4
     ) n2 cross join
     (select 0 as n union all select 1 as n union all select 2 as n union all select 3 union all select 4
     ) n3 cross join
     (select 'a' as letter union all select 'b' union all select 'c' union all select 'd'
     ) l cross join
     (select @rn := 0) params
where n1 + n2*5 + n3*25 < 114;

您可以使用以下 sql 脚本将所需的值插入 table:

INSERT INTO target (id, letter, `number`)
SELECT rn, col, (rn - 1) % 4 + 1 AS seq
FROM (
SELECT col, @rn := @rn + 1 AS rn 
FROM (
   SELECT 'a' AS col UNION ALL SELECT 'b' UNION ALL
   SELECT 'c' UNION ALL SELECT 'd') AS t
CROSS JOIN (
   SELECT 1 AS x UNION ALL SELECT 1 UNION ALL SELECT 1 UNION ALL 
   SELECT 1 UNION ALL SELECT 1 UNION ALL SELECT 1 UNION ALL SELECT 1 UNION ALL
   SELECT 1 UNION ALL SELECT 1 UNION ALL SELECT 1 UNION ALL SELECT 1 ) AS t1
CROSS JOIN (
   SELECT 1 AS x UNION ALL SELECT 1 UNION ALL SELECT 1 UNION ALL 
   SELECT 1 UNION ALL SELECT 1 UNION ALL SELECT 1 UNION ALL SELECT 1 UNION ALL
   SELECT 1 UNION ALL SELECT 1 UNION ALL SELECT 1 UNION ALL SELECT 1 ) AS t2
CROSS JOIN (SELECT @rn := 0) AS var  ) AS s
WHERE rn <= 456

上述查询使用 11 x 11 笛卡尔积创建了一个包含 121 行的数字 table。这些行与 in-line table ('a'), ('b'), ('c'), ('d') 交叉连接,总共产生 484 行。外部查询只选择需要的行,即总共 456 行。

注意:如果要插入值:

id, letter, number
1   'a'     1
2   'b'     1
3   'c'     1
4   'd'     1
5   'a'     2
6   'b'     2
7   'c'     2
8   'd'     2
... etc

而不是值:

id, letter, number
1   'a'     1
2   'b'     2
3   'c'     3
4   'd'     4
5   'a'     1
6   'b'     2
7   'c'     3
8   'd'     4
... etc

然后只需将 (rn - 1) % 4 + 1 AS seq 替换为 (rn - 1) DIV 4 + 1 AS seq

Demo here