Я показываю категорию + количество продуктов с этим кодом:
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 ответа
Во-первых, вам нужно получить все подкатегории, связанные с конкретной категорией. Для этого вы используете рекурсивный 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.
Это то, что вы хотите ?
Вы просто хотите добавить 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
Похожие вопросы
Новые вопросы
sql
Язык структурированных запросов (SQL) - это язык запросов к базам данных. Вопросы должны включать примеры кода, структуру таблицы, примеры данных и тег для используемой реализации СУБД (например, MySQL, PostgreSQL, Oracle, MS SQL Server, IBM DB2 и т. Д.). Если ваш вопрос относится исключительно к конкретной СУБД (использует определенные расширения / функции), используйте вместо этого тег этой СУБД. Ответы на вопросы, помеченные SQL, должны использовать стандарт ISO / IEC SQL.