2009-08-14 16 views
1

別のMySQLのテーブルから詳細を取得し、それが私は特定の月についての情報が含まれますテーブルを持っている

から複数の情報をつかむために、その行の1列が別のテーブルのためのMySQLの行のIDを持っているだろうことはあるが

Row ID | Name | Other Sources 
1  Test 1,2,7 

Other Sourcesはとても

のようなもので、他のテーブルからの行のIDを持っている:idを爆発し、ここに...それぞれに別々のSQL queryiesを行うよりも情報を得るために、よりefficentの方法は一例です
Row ID | Name | Information | Link 
1  John | No info yet? | http://blah.com 
2  Liam | No info yet? | http://blah.com 
7  Steve| No info yet? | http://blah.com 

、全体的な情報がウォールドは、私はこれを行うだろう

Hi this page is called test... here is a list of our sources 
- John (No info yet?) find it here at http://blah.com 
- Liam (No info yet?) find it here at http://blah.com 
- Steve (No info yet?) find it here at http://blah.com 

以下のようなこと戻される...私がして、他のソースを爆発して、それぞれに別々のSQLクエリを行うだろう、私はそこにできたと確信していますより良い方法ですか?

+0

私はあなたの特定の問題に対する答えを持っていますが、ほとんどの時間を他のソース」ことはありません"フィールドは、TableAとTableBの2つの行の間の関連付けを格納する別のリレーショナル表です。これにより、カンマ区切りの値を扱う代わりに、SQLを介して結合を行うことができます。がんばろう。 –

答えて

4

古典的な多対多の関係のように見えます。あなたはページとソースを持っています - 各ページは多くのソースを持つことができ、各ソースは多くのページのソースになりますか?

幸いにも、これはリレーショナルデータベース設計において非常に解決された問題です。次の2つ一緒に関連する第三のテーブルを使用します。

Pages (PageID, Name) 
Sources (SourceID, Name, Information, Link) 
PageSources (PageID, SourceID) 

「PageSources」テーブルのキーはPAGEIDとのSourceIDの両方になります。

そして、例えば、ページのすべてのソースを取得するには、あなたがこのSQLを使用します。

SELECT s.* 
FROM Sources s INNER JOIN PageSources ps ON s.SourceID = ps.SourceID 
AND ps.PageID = 1; 
+1

+1 - 私よりも詳細で有益な答えです! –

+0

2つのテーブルすべてで結果をエコーアウトすることができるsqlは何ですか? –

1

テーブル構造は簡単ではありません。

ID Source 
1  1 
1  2 
1  7 

joinはあなたの友人です。それらのやり方では、「その他のソース」フィールドにコンマ区切りの値でいくつか不快な分割を行わなければなりません。

+0

あなたの方法は別のように思えますが、別のテーブルを作成しないようにする方法はありませんか? –

+0

はい、何をしているのですか?カンマ区切りの値をSQLで分割する方法がありますが、それらの道路は悲しみにつながります。 –

+0

@johnnnnnnnnny - 他に良い選択肢はありません。これはデータベース設計の非常に一般的なパターンであり、これはほぼ完了した1つの方法です。 –

0

私は何かが分かっていないかもしれませんが、単純な結合テーブルではなく、カンマ区切りの値セットで最初のテーブルの単一フィールドを使用しているのはなぜですか?解決策があれば簡単です。

+0

どういう意味ですか? 最初のテーブルにはさまざまなソースを持つたくさんの行があります –

+0

ドミニクは、私がどこに行くのかをカバーするはるかに役に立つ答えを与えました。 – Zac

0

これらのテーブルの問題は、複数値の列を持つことがSQLでうまく機能しないことです。 First Normal Form以上で複数の値の列が禁止されているため、この形式の表はnormalizedと見なされます。

第1正規形の行への上から下への順序はありません...

  1. を意味します。
  2. 左から右への列の順序はありません。
  3. 重複する行はありません。
  4. すべての行と列の交差には、該当するドメインの 値(正確には はありません)が含まれています。
  5. すべての列は規則的です。行には、 行ID、オブジェクトID、または非表示のタイムスタンプなどの隠れたコンポーネントはありません。

-Chris日、「どのような第1正規形本当に手段」、頁127-8 [4]

とにかく、それを行うための最善の方法は、多くの関係に多くを持っていることです。これは、ドミニクロガーが彼の答えで行うように、中間に3番目のテーブルを置くことによって行われます。

関連する問題