2012-02-10 16 views
2

私は現在、いくつかの標準的な多対多リレーションシップを持つMYSQLプロジェクトに取り組んでいます。MySQLはリレーションシップテーブルから一意の値を選択します

私は、私の例を助けるために非常に単純化された関係表を示しました。私は達成するために探しています何

table: book_authors 
ID BOOKS AUTHORS 
1  1  4 
2  1  5 
3  4  4 
4  4  5 
5  2  6 
6  2  1 
7  2  5 
8  3  6 
9  3  5 
10 3  1 
12 5  2 
13 6  2 
14 7  5 

は、著者を指定したすべての書籍を選択して、付属の作家のすべてに一致する本を入手できるようにすることです。毎回要求された著者の数も可変である。

私が著者4と著者5が書いたすべての本を探しているなら、私は書籍1と4の結果しか得られません。私が著者だけが書いた本を探しているならば、私は本7を手に入れるでしょう。

答えて

1

私はこれを行うには非常にスムーズ方法はないと思うが、パフォーマンスは大きな問題ではない場合、あなたはMySQL's GROUP_CONCAT functionを活用し、これを書くことができます:

SELECT books 
    FROM book_authors 
WHERE books IN 
     (SELECT books 
      FROM book_authors 
      WHERE authors = 4 
     ) 
GROUP 
    BY books 
HAVING GROUP_CONCAT(authors ORDER BY authors) = '4,5' 
; 

WHERE句正しい結果を得るために必要なものではありませんが、クエリーをあまり無償で高価にします)。

+0

の一部を忘れてしまいました。ありがとうございました。私は、クエリがあまり実行されないので、パフォーマンスヒットについてあまり心配していません。 – m4rv

0

もしあなたが一人であれば: あまり再現できません。

select distinct 
    ba1.books 
from 
    book_authors ba1 
join 
    book_authors ba2 
    on ba1.id<>ba2.id and ba1.books=ba2.books 
where 
    ba1.authors=5 
    and ba2.authors=4 

編集:これは完璧です参加

+0

あなたの返事をありがとう、これは私が始めたところですが、私はそれを多くの著者に拡大することができませんでした。 – m4rv

関連する問題