2012-01-18 7 views
2

うまくいけば、うまくいけばうまくいきますように。私はライブラリのためのDBを持っています。それらは何度も使用することができ、単なる名前より多くのデータを含んでいるので、私は著者の表を持っています。それから本のためのテーブルがあります。 Author_idという列を使ってAuthors to Booksをリンクするのに問題はありません。列内にXMLとして格納されたリストのidを持つテーブルをリンクするには

私がしようとしているのは、本に複数のIDを持つことができるので、IDのリストを含むAuthor_IDsという列があります。 Author_IDs列に私は:

<id>3478</id> 
<id>6456</id> 

MySQLではEXTRACTVALUE関数を使用し、私が使用して、1つまたは他のIDでテーブルをリンクすることができる: Author.id = EXTRACTVALUE(Book.Author_IDsを、 "/ ID [2 ] ")// 2番目のIDを取得します。

私の質問は、本の著者全員を自動的に表示できるようにしたいのですが、ループすることなく複数回リンクする方法がわかりません。私はすべての著者を私に見せるためにどのように結果を得ることができますか?

(または、これを実現するためのより良い方法はありますか?)

答えて

1

まず、私はあなたの保管方法反対票を投じる必要があります。可能であれば、mysqlカラム内にxmlとしてデータを格納するのは避けてください。通常の方法を使用すると、この問題がはるかに簡単になることがわかります。

テーブルを作成します。

book_authors

book_id  author_id 
-------  --------- 
     1    1 
     1    2 
     1    3 
     2    2 
     2    4 

を次に、それは、単純なクエリの特定の書籍に関連した著者のすべてを取得します。

Select 
    b.book_id, 
    b.book_name, 
    GROUP_CONCAT(a.author_name) AS 'authors' 
FROM 
    book_authors ba LEFT JOIN 
    books b ON ba.book_id = b.book_id LEFT JOIN 
    authors a ON ba.author_id = a.author_id 
GROUP BY 
    ba.book_id 
+0

一部のようにそれを行っているだろう私がXMLを使用している理由は、別々のフィールドとしては実行されない複数の項目を含むフィールドが存在するということです。有名人の声明と表紙裏のレビューを取ってください。私はそれらを別々にしたいが、同じ分野では、しかし、それのためのテーブルの全体をしたくない、それぞれが一度しか使用されていないので。つまり、これはまともなやり方だと思いますので、author_idのbook_idのリストを含む3番目のテーブルがありますか? – Tanoshimi

+0

幸いにも、まだ設計段階にあり、データはまだ追加されていません。しかし、私は、ほとんどすべてのコラムで複数のエントリーが必要だと感じています。そうであれば、アイテムごとに別々のテーブルを作成し、それらのテーブルをすべて接続するためのテーブルを作成する必要がありますか?著者とは別に、ジャンルを取る。この場合、書籍は複数のカテゴリに分類されます。キーワードカンマ区切りのリストとして扱うことができます。それは終わった時点でたくさんのテーブルのように思えます。 – Tanoshimi

+0

明確にするために、書籍エントリに著者にリンクするものは何もありません。唯一のリンクはbooks_authorsテーブルの追加によって行われますか? – Tanoshimi

0

私は完全にわかりません。このような何かがトリックをすることができますか? 。

選択* tblBooksから BはtblAuthorsオン(b.authors = CONCAT( '%'、a.id、 '%') B = '書籍IDを' 参加左;

+0

私はそれが何であるかを理解していません(まだMYSQLには比較的新しいです)。私は1人の本のエントリーにリストされているすべての著者を得ることを望んでいます。だから "ABC"が "John Smith"と "Lisa Jones"によって書かれていれば、それは著者のテーブルの2つの独立したエントリーですが、私は "ABC"の本を照会するときにそれらの両方を見る必要があります。それは理にかなっていますか? – Tanoshimi

+0

実際の列は見えますか?私はあまりにも多くの書き換えをしない限り、Bensの提案に行くだろう。 – tim

+0

幸いにも、まだ設計段階にあり、データはまだ追加されていません。しかし、私は、ほとんどすべてのコラムで複数のエントリーが必要だと感じています。そうであれば、アイテムごとに別々のテーブルを作成し、それらのテーブルをすべて接続するためのテーブルを作成する必要がありますか?著者とは別に、ジャンルを取る。この場合、書籍は複数のカテゴリに分類されます。キーワードカンマ区切りのリストとして扱うことができます。それは終わった時点でたくさんのテーブルのように思えます。 – Tanoshimi

0

Iこの

構造の

tblBooks 
-------- 
book_id 
book_name 

tblAuthors 
---------- 
author_id 
author_name 

tblBooksToAuthors 
----------------- 
id 
book_id 
author_id 

クエリ

select a.* 
from tblAuthors a 
left join tblBooksToAuthors b2a on (b2a.author_id = a.author_id) 
where b2a.book_id = {your book id}; 
関連する問題