gpt4 book ai didi

sql - 我如何编写一个 SQL 查询来返回一个项目的所有类别?

转载 作者:可可西里 更新时间:2023-11-01 08:56:49 25 4
gpt4 key购买 nike

我有一个 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

它在 categories 别名中返回给我所有类别的书籍,在 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

你知道其他更好的变体吗?

最佳答案

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

  • 对于books表中的所有记录,返回一行
  • 如果一本书分配了多个类别,则 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

我真的没有想出更整洁/更简单的方法来实现这一点。顺便说一句,像我在上面所做的那样,花时间使用空格来布置代码是值得的,因为通常认为这样更容易阅读,将来必须维护您的代码的任何人都可能会为此感谢您 =)

关于sql - 我如何编写一个 SQL 查询来返回一个项目的所有类别?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3561051/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com