6

私は3つのテーブルを持っています:

author (columns: aut_id, aut_name)
book (columns: book_id, book_title)
authorbook (linking table, columns: aut_id, book_id)

各著者は、1冊以上の本に関連付けることができます。
各本は、1人以上の著者に関連付けることができます。
名前と著者の正確な数で本を選択したいと思います。

テーブル構造:

author    
aut_id    |   aut_name
1             Aname
2             Bname
3             Cname

book    
book_id    |  book_title (the titles are identical on purpose) 
1             Atitle
2             Atitle
3             Atitle

authorbook
aut_id    |   book_id 
1             1
1             2
2             2
1             3
2             3
3             3

これが私のコードです(わかりやすくするために作成者の表を省略しました):

SELECT authorbook.book_id 
FROM authorbook 
INNER JOIN book
ON authorbook.book_id = book.book_id
WHERE book_title='Atitle'
AND FIND_IN_SET (authorbook.aut_id,'1,2')
GROUP BY authorbook.book_id
HAVING (COUNT(authorbook.aut_id)=2)

問題:このコードはauthorbook.book_id(2)、TWOauthorbook.aut_ids (1,2)だけでなく、authorbook.book_id(3)THREEでも目的のコードを返しますauthorbook.aut_ids (1,2,3)

質問:条項SELECT内の著者に正確に関連付けられている(追加の著者がいない)本を作成するにはどうすればよいですか?FIND_IN_SETあなたの助けをどうもありがとう!

4

2 に答える 2

2

これを試して:

SELECT a.book_id
FROM authorbook a
INNER JOIN book b
ON a.book_id = b.book_id
WHERE b.book_title='Atitle'
  AND FIND_IN_SET (a.aut_id,'1,2')
GROUP BY a.book_id
HAVING COUNT(DISTINCT a.aut_id) = 2
   AND COUNT(DISTINCT a.aut_id) = (SELECT COUNT(DISTINCT a2.aut_id)
                                   FROM authorbook a2 
                                   WHERE a2.book_id = a.book_id);

SQLフィドルデモ

于 2012-12-11T11:37:16.457 に答える
1

これはうまくいくはずです

SELECT COUNT(aut_id) AS authors, book_id FROM (SELECT authorbook.*
FROM authorbook 
INNER JOIN book
ON authorbook.book_id = book.book_id
WHERE book_title='Atitle') AS t1 GROUP BY book_id HAVING authors='2'
于 2012-12-11T11:55:50.150 に答える