2011-06-19 18 views
0

カテゴリ1と2の両方の書籍(たとえばホラーとフィクション)を表示できるクエリを作成しようとしていますが、属する。これについてどうすればいいですか?私は再帰的なサブクエリが必要だと仮定することができますが、これは非効率的である可能性があります。他のすべてのカテゴリを1対多の関係に表示するサブクエリ

SELECT book.bookid, 
     book.author, 
     book.title, 
     Group_concat(DISTINCT category.categorydesc) 
FROM book, 
     bookscategories, 
     category 
WHERE book.bookid = bookscategories.bookid 
     AND bookscategories.categoryid = category.categoryid 
     AND category.categoryid = 1 
     AND category.categoryid = 2 
GROUP BY book.bookid; 

答えて

1
select b.bookid, b.author, b.title, group_concat(distinct c.categorydesc) 
from book as b 
inner join bookcategories as bc on b.bookid = bc.bookid 
inner join categories as c on bc.categoryid = c.categoryid 
where b.bookid in (select bc1.bookid 
    from bookcategories as bc1 
    inner join bookcategories as bc2 on bc1.bookid = bc2.bookid 
    where bc1.categoryid = 1 and bc2.categoryid = 2) 
group by b.bookid; 

それはbookcategoriesテーブルを3回使用していますので、私はこのクエリのパフォーマンスについて確認していません。

b.authorとb.titleを選択することは技術的には正しくありませんが、b.bookidはおそらく一意であるため、この場合は動作します。それ以外の場合は、group by節の一部でもなく、集約関数でも使用されないものを選択することはできません。

category.categoryidを1と2の両方に同時に制限しているため、投稿したコードは常に空の結果セットを返すと考えています。

+0

ありがとうございました!私はパフォーマンスの問題があるかもしれないことに感謝しますが、私はちょうどその時働いてうれしいです! :)また、私は同意する、私は元のクエリを再見てきた、それは 'と'のために動作しない、私は 'または'が働いていただろうが、私は後の結果を与えていないだろうと思う。もう一度ありがとう。 – Tom

関連する問題