2009-11-19 4 views
1

У меня есть дерево, как структура категорий, листовые узлы в дереве имеют продукты и продукты имеют кодеки Мне нужно выбрать все категории верхнего уровня (parent = null), которые имеют листья (Cods), которые соответствуют некоторые critaria ...sql query tree like structure

SELECT 
    Category.Id AS Id0_, 
    Category.Name AS Name0_, 
    Category.COrder AS COrder0_, 
    Category.Description AS Descript4_0_, 
    Category.ParentId AS ParentId0_, 
    Category.Description_En AS Descript6_0_, 
    Category.Name_En AS Name_En0_, 
    Category.ImagePath AS ImagePath0_ 
FROM 
    Category 
    LEFT JOIN Category AS c1 ON Category.Id=c1.ParentId 
    LEFT JOIN Category AS c2 ON c1.Id=c2.ParentId 
    LEFT JOIN Category AS c3 ON c2.Id=c3.ParentId 
    LEFT JOIN Category AS c4 ON c3.Id=c4.ParentId 
    LEFT JOIN Product ON 
     c4.Id=Product.Category 
     OR c3.Id=Product.Category 
     OR c2.Id=Product.Category 
     OR c1.Id=Product.Category 
     OR Category.Id=Product.Category 
    INNER JOIN Cod ON Cod.Product=Product.Id 
WHERE 
    Category.ParentId is null 
    AND Cod.Hidden!='1' 
    AND 
    (
     cod.Stock>0 
     OR (cod.CodBare='0' AND Product.ProdType=8)) 
     AND Cod.Price>0 
    ) 
ORDER BY Category.COrder 

мой запрос выглядит так, но это не решение, потому что это очень-очень медленно ... Может кто-нибудь дать мне предложение о том, как это сделать?

+1

Тупой вопрос ... что вы подразумеваете под «Cods»? –

+0

Какую базу данных вы используете? –

+0

База данных - это MSSQL 2005 о Cods ... продукты больше похожи на типы продуктов, которые имеют множество вариаций (например, размер цвета и т. Д.), А код - это фактический продукт с серийным номером/кодом продукта – bogdanbrudiu

ответ

5

Это обычная проблема. Создание иерархических данных из реляционной базы данных не всегда изящно. Если эти данные не обновляются постоянно, одним из вариантов является выплевывать его как XML и кеш для приложения.

Если вы хотите сохранить его в БД, это общее решение: Managing Hierarchical Data in MySQL.

+0

+1 preorder traversal - это, безусловно, способ пойти – rmeador

+0

+1 good статью о MySQL –

+0

@DA, взгляните на презентацию, которую я опубликовал в своем решении. Если вам нравится модель вложенного набора, вам понравится еще больше «улучшение», вложенная модель интервала. – Sergi

0

Существуют различные решения для представления деревьев в базах данных. Я действительно рекомендую вам взглянуть на эту презентацию, Trees in the database. Обычно я работаю с базой данных с несколькими уровнями и 1,5 миллионами листов, а модель вложенных интервалов действительно освещается.

0

Я не знаю, если вы застряли в этой структуре данных или нет, но вы должны действительно взглянуть на статью Managing Hierarchical Data in MySQL для управления иерархическими данными.

Я использовал описанное здесь решение (в Oracle и MS SQL Server), и это очень быстро.