2011-07-28 7 views
1

にこのできる限りを説明しようとする試みをリレーショナル表を作成:は、MySQL

開始するには、私はテーブルがvocabulary呼ばれています:Excelシートで

+-----+---------------------+ 
| id | name    | 
+-----+---------------------+ 
| 1 | Farming   | 
| 2 | Agriculture  | 
| 3 | Design    | 
| 4 | Graphic Design  | 
| 5 | Interactive Design | 
| 6 | Animal Husbandry | 
| ... |   ...  | 
| 887 | Carpentry   | 
+-----+---------------------+ 

、私は関連」のリストを持っています以下のように見えるかもしれません語彙:私は何をしたいか

Interactive Design      Farming 
--------------------      -------------------- 
Graphic Design       Agriculture 
Design         Animal Husbandry 

vocabulary_relationsと呼ばれるテーブルを作成し、ヘッダ間の関係を作成することです(上記Eでxcelシートの例)をその下のすべての項目に適用します。たとえば、インタラクティブデザインはグラフィックデザインとデザインを指します。農業は農業と畜産を指すだろう。

たとえば、テーブルが(参照としてvocabularyテーブルを使用して)次のようになります。

+----------------+--------------+ 
| vocabulary_id | related_id | 
+----------------+--------------+ 
|  5  |  4  | 
|  5  |  2  | 
|  1  |  2  | 
|  1  |  6  | 
+----------------+--------------+ 

そのように、私はどのvocabulary_idのためのすべてのrelated_idを引くことができます。

たとえば、私がvocabulary_id = 1(耕作)を要求した場合は、それぞれrelated_id => 2, 6(農業、畜産業)を返します。

このような方法を自動化する方法はありますか?私はユーザーインターフェイスを探していません、これは静的なデータです。

ありがとうございました!

+0

「自動化」と言うとき、正確にはどういう意味ですか?私が読んだことから、あなたが望むものは、単純なSQL JOINによって実行できます(多対多の関係のためにすべてのテーブルをSQLに設定したと仮定し、3つの必要なテーブルのうち2つを示しています) 。あなたは上記のテーブルの更新を自動化する何かを探していますか? –

+0

私はそのレベルで多対多または何かを作成するつもりはありません。データは静的であり、最初の提出後は決して変更されません。だから、私が探しているものを達成するために基本的な結合を使用するだけで問題はありません。しかし、私の問題は、データベース内の関係を得ることです。 Joe(下記)が有望に見えるものの、私がCSVでそれを使うことができるかどうかわからない。私は単純にSQLにCSVリストを分析し、それぞれのIDを見つけて、その関係を 'vocabulary_relations'テーブルに作成するだけです。 – stewart715

+0

あなたのエクセルデータを先にピボットしてからエクスポートすると、そのサウンドから、あなたはもっと遠くにいる方が良いでしょう。 RDBMSデータを提供する場合は、一般的にリレーショナルデータが必要です。そうでなければ、どのエントリが「親」エントリであるかを知ることになります。 (ああ、私はあなたが5を4と3に関連させていると思っていましたが、2ではなく、正しいと思います) –

答えて

2
INSERT INTO vocabulary_relations 
    (vocabulary_id, related_id) 
    SELECT v1.id, v2.id 
     FROM RelatedItems ri 
      INNER JOIN vocabulary v1 
       ON ri.col1 = v1.name 
      INNER JOIN vocabulary v2 
       ON ri.col2 = v2.name 
+0

ありがとう。これで、関連するアイテムごとに新しいテーブルを作成する必要がありますか?または、これをCSVリストで使用する方法はありますか? – stewart715

+0

私はあなたの質問を理解していません。これは、すべての関係を1つのテーブルに取り込みますが、それはあなたが望むものではありませんか? –

+0

私はお詫び申し上げます、私はこれに新しいです(これが私がこれらのタイプの質問をしている理由です)。 SQLが実際の関係をどこで取得しているかは、私の質問です。私が言ったように、私はリスト内の項目(およびIDと一緒にすべての項目(一意、重複なし)を持つ表)を持つExcelシートを持っています。だから私は、各リスト(それぞれ約10〜15項目)を通過し、現在の語彙テーブルでIDを見つけ、その名前を照合して、実証済みの関係を作成する必要があります。それは理にかなっていますか?助けてくれてありがとう、ジョー。 – stewart715

0

このようなことを考えましたか? (少なくとも、vocabulary.nameのユニーク制約を前提としています)

create table vocabulary_relations (
    vocabulary_category varchar(35) not null, -- references vocabulary (name), 
    related_vocabulary varchar(35) not null, -- references vocabulary (name), 
    primary key (vocabulary_category, related_vocabulary) 
); 

insert into vocabulary_relations values 
('Interactive Design','Graphic Design'), 
('Interactive Design','Design'), 
('Farming','Agriculture'), 
('Farming','Animal Husbandry'); 

これを行うと、選択は簡単ではありません。

select * 
from vocabulary_relations 
order by vocabulary_category, related_vocabulary; 

vocabulary_category related_vocabulary 
-- 
Farming    Agriculture 
Farming    Animal Husbandry 
Interactive Design  Design 
Interactive Design  Graphic Design 

結合がありません。理解しやすくトラブルシューティングする。 CSVからインポートするのは簡単ではありません。

+0

これは意味があります。残念ながら、私たちは関連するボキャブラリを表示していません。関連するすべての語彙を見つけて、それぞれから特定のリストを照会する必要があります(数字を使用すると効率的です)。あなたの助けをありがとう。 – stewart715