выбрать категорию с самым большим числом подкатегорий вложенных-родительских и путь категорий MYSQL для OPENCART аналог SYS_CONNECT_BY_PATH oracle
как известно сложно выбирать иерархические данные из реляционных данных без рекурсии mysql все еще не поддерживает SQL-1999 рекурсию в запросах типа
WITH [recursive] имя_алиаса_запроса [ (список столбцов) ]
AS (запрос)
основной запрос
можно как то намутить в хранимых процедурах но не хочу с ними связываться
как это можно реализовать одним запросом?
в opencart товар может храниться в нескольких категориях и нужно выбрать самую вложенную категорию и весь путь к родителю(предположим что товар может находится в категориях только одной ветви)
select
pc.category_id, t1.parent_id, t2.parent_id, t3.parent_id, t4.parent_id, t5.parent_id,
!ISNULL( t1.parent_id)+!ISNULL( t2.parent_id)+! ISNULL(t3.parent_id)+!ISNULL( t4.parent_id)+!ISNULL( t5.parent_id) AS d
FROM _product_to_category pc
left join _category t1 on t1.category_id = pc.category_id
left join _category t2 on t1.parent_id = t2.category_id
left join _category t3 on t2.parent_id = t3.category_id
left join _category t4 on t3.parent_id = t4.category_id
left join _category t5 on t4.parent_id = t5.category_id
where
product_id = 3080
order by d DESC
LIMIT 1
но повторю
(предположим что товар может находится в категориях только одной ветви)
еще одно ограничение - это предельно число вложенных категорий
вот полный запрос на выборку всех названий категорий с полным путем самой вложенной категории для товара OPENCART
SELECT cd.* FROM _category_description cd
,
(
select
pc.category_id AS c1,
t1.parent_id AS c2, t2.parent_id AS c3, t3.parent_id AS c4, t4.parent_id AS c5, t5.parent_id AS c6,
!ISNULL( t1.parent_id)+!ISNULL( t2.parent_id)+! ISNULL(t3.parent_id)+!ISNULL( t4.parent_id)+!ISNULL( t5.parent_id) AS d
FROM _product_to_category pc
left join _category t1 on t1.category_id = pc.category_id
left join _category t2 on t1.parent_id = t2.category_id
left join _category t3 on t2.parent_id = t3.category_id
left join _category t4 on t3.parent_id = t4.category_id
left join _category t5 on t4.parent_id = t5.category_id
where
product_id = 3465
order by d DESC
LIMIT 1
) f
WHERE cd.category_id IN (f.c1,f.c2,f.c3,f.c4,f.c5,f.c6)
Комментарии
Оставить комментарий
Базы данных - MySql (Maria DB)
Термины: Базы данных - MySql (Maria DB)