Mysql 自动插入具有重复数据的行,遵循两种模式
我有一张这样的桌子:Mysql 自动插入具有重复数据的行,遵循两种模式,mysql,sql,mariadb,Mysql,Sql,Mariadb,我有一张这样的桌子: | 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
| 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语句,该语句按照此模式自动填充表,直到ID456为止
因此,字母在序列结束前都是abou,abou,abou,abou,abou,abou,abou,abou,abou,abou,abou,abou,abou,abou,abou,abou,abou,abou
我不确定解决这个问题的最佳方法是什么,如果您有任何建议,我们将不胜感激。如果您有某种数字表,这将有所帮助。下面是一种使用交叉连接和一些算法的方法:
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;
如果你有某种数字表的话会有帮助的。下面是一种使用交叉连接和一些算法的方法:
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脚本将所需的值插入表中:
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
而不是价值观:
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 DIV 4+1替换rn-1%4+1作为seq
您可以使用以下sql脚本将所需的值插入表中:
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
而不是价值观:
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 DIV 4+1替换rn-1%4+1作为seq
MySQL插入应该从脚本语言PHP、Perl等调用,并根据需要递增值。MySQL插入应该从脚本语言PHP、Perl等调用,并根据需要递增值。我认为这不是我们想要的结果。他可能想要a,114b,114c,114d,114所以114x4=456@JuanCarlosOropeza抢手货我已经更新了我的答案。谢谢,就是那个!我认为这不是我想要的结果。他可能想要a,114b,114c,114d,114所以114x4=456@JuanCarlosOropeza抢手货我已经更新了我的答案。谢谢,就是那个!