按照两种模式自动插入具有重复数据的行
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
。
我有一个 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
。