2012-01-05 5 views
4

Я унаследовал базу данных, и, пытаясь сделать ее более чистой и полезной, я столкнулся со следующей проблемой.Разделить строку на несколько строк в SQL

После перемещения столбца файлов в отдельную таблицу теперь у меня есть задача разделить эти файлы на разные строки. См. Мой пример ниже.

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

Возможный дубликат [Mysql string split] (http://stackoverflow.com/questions/6152137/mysql-string-split) –

+1

Да Eugen его одноразовая работа. – user1132038

ответ

0

В PHP (предполагается, что $ дб допустимое подключение дб и 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 для запуска - либо запустить их в конце цикла в то время как , или выпустите их, напишите их позже, независимо от того, что соответствует вашему шаблону загрузки.

+0

Помимо добавления подстановочных знаков в инструкцию SQL и добавления «в строку вставки», это сработало отлично. Спасибо большое! – user1132038

+0

Хорошо поймать, я исправил недостающую цитату и подстановочные знаки, извините за это, плохой случай «думать о строке n +1 при вводе строки n " –

+0

Вопрос в том, как это сделать в SQL. – reinierpost

Смежные вопросы