1

のテーブルpersonとのテーブルがありますlanguage。各人は最大4つの言語を話すことができます。たとえば、私のクライアントは話すことができる人を検索したいと考えていますSpanish

私の問題は、結果テーブルにはLanguage複数の列が含まれるため、現在、呼び出される列がないことです。最初の言語だけを表示することもできますが、それらが話す他の言語を非表示にすることは誤解を招く可能性があります。

テーブルには各言語の列を含めることができ、NULL4つの言語すべてがない場合は、次のように入力します。

Language 1
Language 2
Language 3
Language 4

しかし、これは非常にずさんなようです。

カンマ区切りのリストを使用して、すべての言語を1つの列にリストすることを検討しましたが、これは列をアルファベット順に並べ替えるのに適しています。

現在、結果テーブルには、その人が1つ(1対1)、つまり母国語などを持っている列のみを表示できることをクライアントに伝える必要がありますnamelocationクライアントがその人をクリックした場合にのみ、すべてを表示できます。彼らの言語の。

これを解決する一般的な方法があるかどうか誰かが知っていますか?これが理にかなっていることを願っています

私は関連付けテーブルを持っています。問題は、私の検索が返されることです

joe bloggs、ゴッサムシティ、スペイン語

それから

joe bloggs、ゴッサムシティ、フランス語

次の行に-しかし、同じ人が表に2回リストされています。名前ごとに1つのエントリに制限すると、「joe bloggs、gotham city、spanish」と表示されます。彼がフランス語も話していることを今は知りません。これはより明確ですか?

4

4 に答える 4

1

人と言語の2つのフィールドを含む結合テーブルが必要です。言語ごとに1人につき1つの行があるはずなので、1人が4つの言語を話す場合、このユーザーには4つの行があります。

このテーブルの主キーは、両方のフィールドで構成されます。

次に、スペイン語を話す人のリストを取得するには、次のようなクエリが必要になります

select people.name
from people inner join p2l
on people.id = p2l.person
inner join languages
on p2l.language = languages.id
where languages.name = 'Spanish'

そして、言語を話すすべての人々のリスト

select people.name, languages.name
from people inner join p2l
on people.id = p2l.person
inner join languages
on p2l.language = languages.id 

そして今、彼らが言語を話すかどうかにかかわらず、すべての人々のリスト

select people.name, languages.name
from people left join p2l
on people.id = p2l.person
inner join languages
on p2l.language = languages.id 
于 2012-09-23T09:04:57.007 に答える
0

したがって、これを解決する従来の方法は、個人テーブルと言語テーブルの両方への外部キーを持つ、関連付けテーブルと呼ばれるものを作成することです。これにより、任意の数の言語(ゼロを含む)を追加できます。次に、これらのテーブルを結合して、特定の言語を話すすべてのユーザーを見つけることができます。

これは、データベースの構造化に役立つ場合があります。http: //en.wikipedia.org/wiki/First_normal_form より高い正規形がありますが、これは現在の問題を解決するのに役立ちます。

于 2012-09-23T09:01:17.037 に答える
0

これについてもう少し考えてみると、次の選択肢があるようです

  1. クリストフと私が提案した単純な結合/リンク/関連付けテーブルを使用してから、SQLを呼び出すプログラムのデータをマッサージします。これが最も簡単なルートです。
  2. 結合テーブルとともに、コンマで区切られた言語のリストを維持します。結合テーブルを使用すると、「スペイン語を話す人」などのクエリに答えることができますが、リストを使用すると、1人あたりの言語のリストを印刷できます。このリストを維持することは問題になります。
  3. Ravindraの「言語ごとの専用フィールド」アプローチを使用します。新しい言語が必要になるたびに、フィールド構造を変更する必要があるため、このアプローチはあまりお勧めできません。
  4. クロスタブクエリを使用します。これを行うのは非常に難しく、使用しているSQLのフレーバーによって異なります。この記事createing-cross-tab-queries-and-pivot-tables-in-sqlをご覧ください。

私のオプションでは、オプション1が最適で最も簡単です。SQLは、それが何をするかについては優れており、何をしないかについてはひどいので、SQLの最良の部分を取り、宣言型言語の最良の部分でそれらを囲むことが最善です。

于 2012-09-24T04:11:08.577 に答える
0


必要に応じて、 cloumnsを持つ2人のテーブルパーソンを作成しますperson_id,person_name & more
別のテーブルを作成する-列を持つ 言語-言語にアクセスしたいときに今すぐ作成し、person_idを比較してそれらをフェッチするだけperson_id,lang1,lang2,lang3,lang4
ですperson_id as foreign key

 SELECT p.person_id
FROM person p, language l
WHERE p.person_id = l.person_id;
于 2012-09-23T09:05:29.480 に答える