How can I write an SQL query that will return all the categories of an element to me?

I have an SQL query:

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

And he returns to me in categories an alias of all categories of books and cids of all categories of identifiers.

And when I add the WHERE clause as follows:

WHERE c.id = 10

In categories I will have only one category, and this is understandable. But how can I write an SQL query that will return to me all categories of books in categories with a limit condition:

WHERE c.id = 10

[EDIT 1]

Only option:

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

Do you know other best options?

+3
source share
1 answer

, , ( ):

  • 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

/ , . , , , , , , , =)

+1

Source: https://habr.com/ru/post/1761403/


All Articles