2012-01-05 76 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はこれを達成するために削除する必要がある場合、それは問題ではdoesntのため、以下の解決策にもなります受け入れ可能:

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で

+0

これは一度の仕事であると私は理解しています。 –

+0

[Mysql string split]の複製が可能です(http://stackoverflow.com/questions/6152137/mysql-string-split) –

+1

はいEugenはその1回の仕事です。 – user1132038

答えて

0

($ DBを仮定すると、有効なDB接続で、keyがAUTO_INCREMENTです): - のいずれかwhileループの最後にそれらを実行

$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

行方不明の引用符とワイルドカードを修正しました。申し訳ありませんが、 +1行を入力しながら+1 " –

+0

質問は、SQLでそれを行う方法です。 – reinierpost