提问者:小点点

从一个类别中选择除属于其他类别的图书以外的所有图书


我有3个表:books,book_categories,categories

book_categories表“联接”bookscategories。它包含列:idbook_idcategory_id

所以一本书可能属于很多类别,一个类别可能有很多本书。

我需要从given_category检索除属于given_set_of_category的书籍以外的所有书籍的查询。例如,我想要A类中的所有书籍,但前提是它们不属于B类或C类。我还需要按book.inserted列对结果进行排序。

我知道如何使用2个联接从given_category中获取所有书籍,但不知道如何在结果中从其他类别中排除一些书籍。我无法在PHP中过滤书籍,因为我正在对搜索结果进行分页。


共2个答案

匿名用户

where
  category_id = <given category>
  and books.book_id not in
(
 select book_id from book_categories
  where category_id in (<given set of cat>)
)
order by books.inserted

匿名用户

所以,如果你的意思是它属于一个类别,而不属于其他类别:

AND EXISTS(SELECT * FROM books b JOIN book_categories bc ON b.id = bc.book_id JOIN categories c ON bc.category_id = c.id AND c.id = 'A')
AND NOT EXISTS(SELECT * FROM books b JOIN book_categories bc ON b.id = bc.book_id JOIN categories c ON bc.category_id = c.id AND c.id != 'A')