2017-11-10 11 views
1

私はデータレコードを持つ.csvファイルを持っています。各行には組織の部署が含まれています。私はそれらをMySQLデータベースにインポートし、それらをWebアプリケーションで表示したいと思います。データレコードのサンプル要約は次のようになります。SQLテーブル内のデータを分割する方法

もちろん
| Company A | Department aaa | 
| Company A | Department bbb | 
| Company A | Department ccc | 
| Company B | Department ddd | 
| Company B | Department eee | 
| Company C | Department fff | 
| Company C | Department ggg | 
| Company C | Department hhh | 
| Company D | Department iii | 
| Company E | Department jjj | 
| Company E | Department kkk | 

が、私はそれがこのように見えますこれは、その関連部門が付属で一回、それぞれの会社を表示したい、多かれ少なかれ:

| Company A | Department aaa | 
|   | Department bbb | 
|   | Department ccc | 
| Company B | Department ddd | 
|   | Department eee | 
| Company C | Department fff | 
|   | Department ggg | 
|   | Department hhh | 
| Company D | Department iii | 
| Company E | Department jjj | 
|   | Department kkk | 

私の質問は、これらのデータレコードを連結する最良の方法は何ですか?適切なプログラミング言語(PHP、Ruby、Perlなど)を使用して実行するか、SQLクエリを使用してデータベースで実行しますか? SQLが選択されている場合は、ストアドプロシージャ、一時テーブル、またはインポートインタフェースを使用してSQLを実行しますか?それがSQLの場合、どのように見えますか?ありがとうございました!

+0

ファイルを既存のデータベース/アプリケーションにインポートする方法を尋ねていますか、これはまだ設計していないCSVファイルに関するソリューションの設計について議論する質問ですか?それが後者ならば、それはそれのための質問ではありません。 – Nope

+0

MySQLはこのクエリを比較的簡単にするCTE( 'WITH RECURSIVE'節)をサポートしていません。 PostgreSQLとSQLite3は、例えば次のようなソリューションを持っています:http://sqlfiddle.com/#!15/69fff/3/0 – tonypdmtr

+0

@tonypdmtr、MySQL 8.0.1以降では再帰的なCTEをサポートしています。しかし、8.0はまだリリース候補の状態にあります。 –

答えて

1

によってすべてと順序を選択することができますデータベース内のすべての行の部門。データベース内の行に暗黙の「順序」というものはないので、行が「前」行と同じように扱う方法はありません(前には意味がありません)。

クエリ結果セットの行で冗長な会社名を空白にするのは面倒なことではありません。冗長に見えても、すべての行に表示させるだけです。

あなたのアプリケーションでは、データを提示するときに、を実行します。には、表示する順番に処理する機会があります。ですから、このようなもの(擬似コード)を行うだろう:ビルのソリューションは、確かに私のバイアスが別々のデータベース・エンティティ(および拡張により、個別のテーブル)を作成することで、動作しますが

query 'SELECT Company, Department FROM MyTable ORDER BY Company, Department' 

prev_company = '' 

while row = fetch 
do 
    if row.company == prev_company 
     display '' 
    else 
     display row.company 
     prev_company = row.company 

    display row.department 
done 
+1

なぜdownvote?私の経験では、これは実際にほとんどのアプリケーションがこれを行う方法です。 –

-1

私はSQLでそれをやっていますが、それは通常のGROUP BY型のクエリであると思われますので、データベースがあなたのためにできるときに、サーバーコードでジャンプする必要はありません。必要に応じて、生のクエリを実行するかORMを使用します。どちらの方法は、SQLのようなものでなければなりません:すべての部署名が一意である場合を除き

SELECT organisation, department FROM table GROUP BY organisation;

、あなたはちょうどあなたがそれと関連会社を保管しなければならない組織名

0

をいつでも一対多の関係がありますあなたが描いたもののように。

だから私はcompanyテーブルとdepartmentテーブルを作成し、外部キーcompany_id列によってcompany表にdepartment参照行を持っているでしょう。あなたは、すべての部門レコードを選択し、会社のテーブルに対して結合し、そしてのcompany_idによってオーダーができ

TABLE: company 
id 
name 

TABLE: department 
id 
company_id 
name 

その後...そしてあなたは、ポストプロセスをすることができ、クエリの結果は何が必要なデータ構造に。

データを1つのテーブルにまとめることよりも結合を好む理由はたくさんあります。より柔軟性があり、相互に関連するモデルのツリー構造を模倣しています。しかし、最大の理由は次のとおりです。

データを複製していません。会社の名前が変更された場合、その会社に関連するすべてのレコードではなく、1つのレコードのみを更新する必要があります。 2)より柔軟です。後で

関連する問題