1

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

book_categoriesテーブル「結合」bookscategories。列が含まれています:id、、。book_idcategory_id

したがって、1冊の本が多くのカテゴリに属し、1つのカテゴリに多くの本が含まれる場合があります。

given_categoryに属する本を除くすべての本を取得するクエリが必要given_set_of_categoriesです。たとえば、カテゴリAのすべての本が必要ですが、カテゴリBまたはCにも属していない場合に限ります。また、結果をBook.inserted列で並べ替える(並べ替える)必要があります。

2つの結合ですべての本を取得する方法は知ってgiven_categoryいますが、結果として他のカテゴリから一部の本を除外する方法がわかりません。検索結果をページ分割しているため、PHPで本をフィルタリングできません。

4

3 に答える 3

1
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
于 2012-11-16T00:24:18.470 に答える
0

したがって、それが1つのカテゴリに含まれているが、他のカテゴリには含まれていないことを意味する場合:

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')
于 2012-11-16T00:26:24.087 に答える
0

これは、book_categoriesエントリが一意であり、book_idとcategory_idの組み合わせ繰り返されていない場合にカウントすることで達成できると思います。レコードを直接除外しようとする代わりに、カテゴリ[、]の組み合わせセットから選択し、:に属するbook_idエントリをカウントします。

COUNT(IF(category_id = <given_category>, 1, NULL)) as cnt_exists

必要なカテゴリが含まれていることを確認した後、合計をカウントして、他のカテゴリにも属しているかどうかを確認します。

COUNT(*) AS cnt_total


SELECT * FROM books b JOIN (
  SELECT book_id, 
         COUNT(IF(category_id = <given_category>, 1, NULL)) as cnt_exists, 
         COUNT(*) AS cnt_total FROM book_categories WHERE
         category_id IN(<given_category>, <given_set_of_categories>)
) bc ON b.id = bc.book_id AND 
        cnt_exists = 1 AND cnt_total = 1 ORDER BY b.inserted
于 2012-11-17T07:48:11.807 に答える