我有3个表:books
,book_categories
,categories
。
book_categories
表“联接”books
和categories
。它包含列:id
、book_id
、category_id
。
所以一本书可能属于很多类别,一个类别可能有很多本书。
我需要从given_category
检索除属于given_set_of_category
的书籍以外的所有书籍的查询。例如,我想要A类中的所有书籍,但前提是它们不属于B类或C类。我还需要按book.inserted列对结果进行排序。
我知道如何使用2个联接从given_category
中获取所有书籍,但不知道如何在结果中从其他类别中排除一些书籍。我无法在PHP中过滤书籍,因为我正在对搜索结果进行分页。
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')