2

うまくいけば、質問はそれをうまく説明します。ライブラリ用のDBがあります。それらは何度も使用でき、名前だけでなく多くのデータが含まれているため、作成者用のテーブルがあります。次に、Booksのテーブルがあります。Author_idという列を介して著者を本にリンクすることに問題はありません。

私がやろうとしているのは、本が複数のIDを持つことができるので、IDのリストを含むAuthor_IDsと呼ばれる列を持つことです。Author_IDs列には、次のものがあります。

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

MySQLでExtractValue関数を使用すると、次を使用してテーブルをいずれかのIDにリンクできます。WHEREAuthor.id = ExtractValue(Book.Author_IDs、 "/ id [2]")//2番目のIDを取得します。

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

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

4

3 に答える 3

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
于 2012-01-18T19:50:49.903 に答える
0

私が完全に理解しているかどうかはわかりません。このようなものでうまくいくでしょうか?

select a.* from tblBooks b left join tblAuthors a on (b.authors = concat('%', a.id, '%') where b = 'book id';

于 2012-01-18T19:52:43.617 に答える
0

こうすればよかった

構造

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};
于 2012-01-18T20:49:00.927 に答える