Я показываю категорию + количество продуктов с этим кодом:

SELECT 
    c.category_name, COUNT(p.category_id) AS product_count 
FROM 
    categories AS c
LEFT JOIN 
    products AS p ON p.category_id = c.category_id
WHERE 
    c.sub_category_id = '@variable' 
GROUP BY 
    c.category_name

Результат такой:

Category_1 (0)
Category_2 (0)

Потому что, когда вы можете нажать на категорию ваших товаров в подкатегории. Это означает, что продукты имеют sub_category_id в базе данных, а не основной category_id.

  Sub_Category_1 (20)
  Sub_Category_2 (5)

Таблица Категории :

category_id, category_name,   sub_category_id
---------------------------------------------
1            Category_1             0
2            Category_2             0
3            Sub_Category_1         1   >> Category_1
4            Sub_Category_2         2   >> Category_2  
5            Sub_Category_1_Sub     3   >> Sub_Category_1
6            Sub_Category_2_Sub     4   >> Sub_Category_2

Таблица Продукты :

product_id  category_id
------------------------    
1             3
2             4
3             3
4             4
5             5
6             6

Я хотел бы показать общее количество товаров по основной категории .

Потому что, как вы видите, Category_1 и Category_2 возвращает (0)

Любые идеи?

Ожидаемый результат:

Categories (30)
  Sub Categories_1(15)
    Sub_Categories_Sub_1(10)
    Sub_Categories_Sub_2(5)
  Sub Categories_2(15) 
    Sub_Categories_Sub_1(2)
    Sub_Categories_Sub_2(8)
    Sub_Categories_Sub_2(5)

ОБНОВЛЕНО 18.08.2019 - 17:15

-2
Mert 18 Авг 2019 в 14:24

2 ответа

Лучший ответ

Во-первых, вам нужно получить все подкатегории, связанные с конкретной категорией. Для этого вы используете рекурсивный cte.
Затем вы используете левое соединение между этим рекурсивным cte и таблицей продуктов, считая группу продуктов по корневой категории.
Вот пример кода:

Сначала создайте и заполните примеры таблиц ( Пожалуйста, сохраните этот шаг в своих будущих вопросах):

DECLARE @Categories AS TABLE
(
    category_id int, 
    category_name varchar(50),   
    sub_category_id int
)
INSERT INTO @Categories (category_id, category_name, sub_category_id) VALUES
(1, 'Category_1'        , 0),
(2, 'Category_2'        , 0),
(3, 'Sub_Category_1'    , 1),
(4, 'Sub_Category_2'    , 2),
(5, 'Sub_Category_1_Sub', 3),
(6, 'Sub_Category_2_Sub', 4);

DECLARE @Products AS TABLE
(
    product_id  int,
    category_id int
)

-- comments to make it clear which product belongs which main category
INSERT INTO @Products (product_id, category_id) VALUES
(1, 3), -- Category_1
(2, 4), -- Category_2
(3, 3), -- Category_1
(4, 4), -- Category_2
(5, 5), -- Category_1
(6, 5); -- Category_1

Затем рекурсивный cte:

WITH CTE AS
(
    SELECT category_id, category_name, sub_category_id, category_name As MainCategoryName
    FROM @Categories 
    WHERE sub_category_id = 0
    -- If you want to start from a particular subCategory you can change the where condition:
    -- for instance, `where category_id = 3` will count the products the belongs to Sub_Category_1 and Sub_Category_1_Sub
    UNION ALL

    SELECT T.category_id, T.category_name, T.sub_category_id, MainCategoryName
    FROM @Categories AS T
    JOIN CTE
        ON T.sub_category_id = CTE.category_id
)

Запрос:

SELECT MainCategoryName As CategoryName, COUNT(P.product_id) As NumberOfProducts
FROM CTE
LEFT JOIN @Products As P
    ON P.category_id = CTE.category_id 
GROUP BY MainCategoryName 

Полученные результаты:

CategoryName    NumberOfProducts
Category_1      4
Category_2      2

Вы можете увидеть живое демо на rextester.

1
Zohar Peled 18 Авг 2019 в 14:21

Это то, что вы хотите ?

Вы просто хотите добавить category_id в вашу группу и иметь счетчик, как показано ниже

   SELECT category_id ,c.category_name, 
  count(*) AS product_count FROM 
     categories AS c
     LEFT JOIN products AS p ON
  p.category_id = c.category_id
  WHERE c.sub_category_id='@variable' 
     GROUP BY category_id, 
     c.category_name
0
Himanshu Ahuja 18 Авг 2019 в 12:02