Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/55.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/powerbi/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Mysql 从一个类别中选择除属于其他类别的书籍以外的所有书籍_Mysql_Sql - Fatal编程技术网

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

Mysql 从一个类别中选择除属于其他类别的书籍以外的所有书籍,mysql,sql,Mysql,Sql,我有3个表格:书籍、书籍类别、类别 图书类别表连接图书和类别。它包含以下列:id、book\u id、category\u id 所以一本书可能属于许多类别,一个类别可能有许多书 我需要一个查询,该查询检索给定类别的所有书籍,但属于给定类别的给定集合的书籍除外。例如,我想要A类的所有书籍,但前提是它们不属于B类或C类。我还需要按Book.inserted列对结果进行排序 我知道如何使用2个联接从给定的_类别中获取所有书籍,但无法确定如何在结果中排除其他类别中的一些书籍。我无法用PHP筛选书籍,因

我有3个表格:书籍、书籍类别、类别

图书类别表连接图书和类别。它包含以下列:id、book\u id、category\u id

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

我需要一个查询,该查询检索给定类别的所有书籍,但属于给定类别的给定集合的书籍除外。例如,我想要A类的所有书籍,但前提是它们不属于B类或C类。我还需要按Book.inserted列对结果进行排序


我知道如何使用2个联接从给定的_类别中获取所有书籍,但无法确定如何在结果中排除其他类别中的一些书籍。我无法用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')

所以,如果你的意思是它在一个类别中,但不在任何其他类别中:

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')

我认为这可以通过计数实现,前提是图书分类条目是唯一的,因此图书id和分类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

我认为这可以通过计数实现,前提是图书分类条目是唯一的,因此图书id和分类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

工作正常,但当给定集合中的元素数>1时,工作速度非常慢-如15秒pn查询。。。现在我只需要排除一个类别,它工作得很好,但是当给定集合中的元素数>1时,它工作得非常慢-比如15秒。。。现在,我只需要排除一个类别,它工作得很好