Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/url/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
如何编写一个SQL查询,返回项目的所有类别?_Sql_Mysql - Fatal编程技术网

如何编写一个SQL查询,返回项目的所有类别?

如何编写一个SQL查询,返回项目的所有类别?,sql,mysql,Sql,Mysql,我有一个SQL查询: SELECT b . * , CONCAT( GROUP_CONCAT( c.name ) ) categories, CONCAT( GROUP_CONCAT( c.id ) ) cids FROM books b JOIN categories_of_books cb ON b.id = cb.book_id JOIN categories c ON c.id = cb.category_id GROUP BY b.id 它在类别别名所有图书类别和cids所有类别ID

我有一个SQL查询:

SELECT b . * , CONCAT( GROUP_CONCAT( c.name ) ) categories, CONCAT( GROUP_CONCAT( c.id ) ) cids
FROM books b
JOIN categories_of_books cb ON b.id = cb.book_id
JOIN categories c ON c.id = cb.category_id
GROUP BY b.id
它在类别别名所有图书类别和cids所有类别ID中返回给我

当我添加WHERE子句时,如下所示:

其中c.id=10

分类中我只会有一个分类,而且很清楚。但是,我如何编写SQL查询,它将返回具有限制条件的categories别名中的所有图书类别:

其中c.id=10

[编辑1]

唯一变体:

SELECT b . * , GROUP_CONCAT( c.name ) categories, GROUP_CONCAT(CAST(c.id AS CHAR)) cid
FROM books b
JOIN categories_of_books cb ON b.id = cb.book_id
JOIN categories c ON c.id = cb.category_id
WHERE b.id in (SELECT categories_of_books.book_id FROM categories_of_books join categories on categories_of_books.category_id = categories.id WHERE categories.id = 10)
GROUP BY b.id

你知道其他更好的变体吗

您的要求基本上是(如果我正确解释了您的要求):

  • 对于
    book
    表中的所有记录,返回一行
  • 如果一本书分配了多个类别,则
    categories
    列将包含“category_1、category_2、category3”,即所有类别名称的串联
  • 仅当其中一个类别为
    categories.id
    =10时
您需要做的是首先选择id=10的类别中的所有书籍:

SELECT cb.book_id 
FROM   categories_of_books cb
WHERE  cb.category_id = 10
现在,您希望所有书籍都位于该子集中:

SELECT b.*
FROM   books b
WHERE  b.id IN
(
    SELECT cb.book_id 
    FROM   categories_of_books cb
    WHERE  cb.category_id = 10
)
现在,您可以将其转换回复杂的分组查询:

SELECT b.*, 
       CONCAT(GROUP_CONCAT(c.name)) categories, 
       CONCAT(GROUP_CONCAT(c.id)) cids
FROM   books b
JOIN   categories_of_books cb 
       ON b.id = cb.book_id
JOIN   categories c 
       ON c.id = cb.category_id
WHERE  b.id IN
(
    SELECT cb.book_id 
    FROM   categories_of_books cb
    WHERE  cb.category_id = 10
)
GROUP BY b.id

我实在想不出比这更整洁/简单的方法来实现这一点。顺便说一句,正如我在上面所做的那样,花点时间用空格来展示代码是值得的,因为通常认为这样更容易阅读,将来需要维护代码的任何人都会为此感谢你=)

请在问题的标题中添加上下文。“可能吗?”没有任何意义。我认为您可能试图在一个查询中做得太多了。集中精力编写一个只选择book_id=10的所有类别的查询。不,当类别等于10或其他时,查询必须返回每本书的书籍和类别谢谢,但是我的第二个查询(edit1)和您的上一个查询之间有什么区别?它能更优化吗?@DimaKrasun,我刚刚看到你的编辑,老实说,没有真正的方法使查询有任何不同,尽管值得指出的是,我不担心在我的子查询中将书籍的
类别加入到
类别中,因为这实际上不是必需的,这可能会使它稍微更优化一些=)