如何编写一个SQL查询,返回项目的所有类别?
我有一个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
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
- 如果一本书分配了多个类别,则
列将包含“category_1、category_2、category3”,即所有类别名称的串联categories
- 仅当其中一个类别为
=10时categories.id
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,我刚刚看到你的编辑,老实说,没有真正的方法使查询有任何不同,尽管值得指出的是,我不担心在我的子查询中将书籍的
类别加入到类别中,因为这实际上不是必需的,这可能会使它稍微更优化一些=)