2016-11-15 3 views
1

こんにちは私は、繰り返しデータを持つMySQLテーブルでいくつかの非正規化を行う必要があります。反復するmysqlデータを非正規化する方法は?

私の「資料」の表では、この形式では現在、次のとおりです。

Publications Source Table 

| title     |  author 
-------------------------------------------- 
| my paper    |  michael 
| my paper    |  bill 
| my paper    |  jill 
| other paper    |  tom 
| other paper    |  amy 
| third paper    |  ben 
| third paper    |  sophie 

私はこの形式に変更する必要があります。今すぐ

Publications Destination Table 

| title     | author | author2 | author 3 
|----------------------------------------------------------------- 
| my paper    | michael | bill  | jill 
| other paper    | tom  | amy  | 
| third paper    | ben  | sophie | 

、ちょうどあなたの情報のために私はので、これを行う必要があります私は最終的にCSVファイルを入手できるので、古いシステムからこの形式のCSVファイルを必要とする新しいシステムにデータをエクスポートすることができます。

また、テーブルには他の多くのフィールドがあり、ソーステーブルには約60,000の行がありますが、ユニークなタイトルは約15,000個だけです。ソーステーブルには、著者ごとに1つの行があります。宛先では、タイトルは一意の識別子になります。一意の出版タイトルごとに1行が必要です。また、もし問題がより簡単になるならば、最も多くの著者がどの出版物にあるのかを事前に計算することができます。

MySQLでこれを行うにはどうすればよいですか?ありがとう

+2

あなたのGoogle検索文字列は「mysqlピボットクエリ」 –

+1

上記の最初のテーブルデザインは、作成したいものよりも優れていますが、依然として作業が必要です。私は、出版物の表にタイトルと他の情報が含まれているだけで、出版物には1つの価値しか持たせることができません。次に、パブリケーションが複数の値を持つことができる情報のそれぞれのための別個のテーブル。 – CptMisery

+1

私が手に入れようとしている形式は、単に他の誰かがすでにインポートプログラムを書いている形式ではありません。データは高度に正規化されたエンタープライズデータベースシステムになりますが、ベンダーはこの特定のCSV形式を使用してデータをインポートするオプションを提供しています。 –

答えて

2

:だからあなたの新しいテーブル構造は次のようになりますあなたのタイトルにカンマが含まれています良いチャンスがありますように私は、セパレータとしてパイプを使用しました

SELECT title, GROUP_CONCAT(author SEPARATOR "|") AS authors FROM publications GROUP BY title;

:システムは、MySQLでGROUP_CONCAT()関数を試みることができます。これをcsvファイルとして完成させたい場合は、パイプ文字の検索と置換を行い、必要なものに変換することができます(例えば、", ")。

+0

私は、正しい出力を生成するためにテーブルを再構築するよりも、適切な出力を生成する*クエリ*によってOPがはるかに優れていると思います。 –

+0

これは正しい方向の一歩ですが、ヘッダ列 "author1、author2 ... author13"を追加してテキストファイルに結合する必要がありますが、それは難しくありません。 –

-1

私の補足の著者のために新しい列を追加するのではなく、テーブルを実際に正規化することです。あなたが実際にテーブルの構造を変更したい、とだけではなく、あなたが新しいにインポートすることができますので、外にデータを取得したくない場合

Publications Source Table 

| title_id   |  title 
-------------------------------------------- 
| 1    |  my paper 
| 2    |  other paper 
| 3    |  third paper 


| title_id  |  author 
-------------------------------------------- 
| 1    |  michael 
| 1    |  bill 
| 1    |  jill 
| 2    |  tom 
| 2    |  amy 
| 3    |  ben 
| 3    |  sophie 
+0

このフォーマットのデータが必要なので、なぜそれをお勧めしますか?古いシステムから、このフォーマットのCSVファイルを必要とする新しいシステムにエクスポートすることができます。 –

+2

この他のシステムが「新規」の場合は、それを制御できますか?要件を変更できますか?または変化を提唱する?私が提案したのは、標準的なデータベース設計の実践に沿ったものでした。設計上、csvが新しいテーブル構造を反映している場合は、新しいシステムのテーブルに対してクエリを書くのがずっと難しくなります。私のデザインは、タイトルごとの著者数の点でより柔軟です。あなたのデザインは、タイトルが私が頻繁であると仮定している最大値よりも少ない場合、空の著者フィールドをたくさん作成します。 – mba12

+0

新しいサロゲートID番号を追加すると、正規化とは何も関係ありません。 –

関連する問題