Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/70.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Mysql 在SQL中将字符串拆分为多行_Mysql_Sql - Fatal编程技术网

Mysql 在SQL中将字符串拆分为多行

Mysql 在SQL中将字符串拆分为多行,mysql,sql,Mysql,Sql,我继承了一个数据库,在努力使它更干净、更有用的过程中,我遇到了以下问题 将“文件”列移动到单独的表后,我现在的任务是将这些文件分离到不同的行中。请看我下面的例子 key | jobid | files | -------------------------------------------- 1 30012 file1.pdf;file2.pdf 2 30013 file3.pdf 3 30014

我继承了一个数据库,在努力使它更干净、更有用的过程中,我遇到了以下问题

将“文件”列移动到单独的表后,我现在的任务是将这些文件分离到不同的行中。请看我下面的例子

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
为了实现这一点,是否必须删除原始入口无关紧要,因此以下解决方案也是可以接受的:

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
基本上我只需要把文件字符串拆分到;分隔符和使用拆分字符串创建的新行


如果您能提供任何帮助,我们将不胜感激。

在PHP中,假设$db是有效的db连接,并且密钥是自动递增的:

$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循环结束时运行它们,要么成批运行它们,然后写出适合您的加载模式的语句。

我有一个完全相同的问题,找到一篇可能有帮助的文章,他们提供了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
我已经在这里的操场上加上了这个键名

参考:

我理解这是一个一次性作业-没错?可能是Eugen的重复,这是一个一次性作业。除了在SQL语句中添加通配符和在插入行中添加a外,这一操作非常有效。非常感谢!很好,我更正了缺少的引号和通配符,很抱歉,在键入第行时考虑第n+1行是一个糟糕的情况。问题是如何在SQL中执行。