我继承了一个数据库,为了使其更清洁,更有用,我遇到了以下问题。
将文件列移动到单独的表后,我现在的任务是将这些文件分成不同的行。请参阅下面的示例。
key | jobid | files |
--------------------------------------------
1 30012 file1.pdf;file2.pdf
2 30013 file3.pdf
3 30014 file4.pdf;file5.pdf;file6.pdf
我想要一个SQL语句,使表格成为以下内容:
key | jobid | files |
--------------------------------------------
1 30012 file1.pdf
2 30013 file3.pdf
3 30014 file4.pdf
4 30012 file2.pdf
5 30014 file5.pdf
6 30014 file6.pdf
如果必须删除原始的entrys以实现这一点,那么以下解决方案也是可以接受的:
key | jobid | files |
--------------------------------------------
4 30012 file1.pdf
5 30013 file3.pdf
6 30014 file4.pdf
7 30012 file2.pdf
8 30014 file5.pdf
9 30014 file6.pdf
基本上我只需要将文件字符串拆分为;分隔符和使用拆分字符串创建的新行。
您可以提供任何帮助。
答案 0 :(得分:0)
在PHP中(假设$ db是有效的数据库连接而key
是auto_increment):
$sql="select `key`, jobid, files from filestable where files like '%\\;%'";
$qry=mysql_query($sql,$db);
$sql=array();
while (true) {
$row=mysql_fetch_row($qry);
if (!$row) break;
$key=$row[0];
$jobid=$row[1];
$files=explode(';',$row[2]);
foreach ($files as $file) {
$file=mysql_real_escape_string($file,$db);
$sql[]="insert into filestable (jobid,files) values ($jobid,'$file')";
}
$sql[]="delete from filestables where `key`=$key";
}
现在$ sql有一个要运行的SQL语句数组 - 要么在while循环结束时运行它们,要么将它们批处理,将它们写出以供以后使用,无论适合你的负载模式。
答案 1 :(得分:0)
我有完全相同的问题,找到了一篇可能有帮助的文章,他们提供了MySQL脚本
create table books (tags varchar(1000));
insert into books values
('A, B, C, D'),
('D, E'),
('F'),
('G, G, H')
;
select
TRIM(SUBSTRING_INDEX(SUBSTRING_INDEX(B.tags, ',', NS.n), ',', -1)) as tag
from (
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
) NS
inner join books B ON NS.n <= CHAR_LENGTH(B.tags) - CHAR_LENGTH(REPLACE(B.tags, ',', '')) + 1
我已经在这里的操场上添加了键名
https://www.db-fiddle.com/f/kLeLYVPmuoFtLEuAb8ihuE/0
参考:
https://www.holistics.io/blog/splitting-array-string-into-rows-in-amazon-redshift-or-mysql/