2009-11-19 11 views
1

J'ai un arbre comme la structure des catégories, les feuilles des nœuds dans l'arbre ont des produits et les produits ont morues je dois sélectionner toutes les catégories de niveau supérieur (parent = null) qui ont leafs (morues) qui correspondent à certains critaria ...arbre de requête SQL comme la 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 

ma requête ressemble à ceci, mais ce n'est pas une solution car il est très très lent ... quelqu'un peut-il me donner une suggestion sur la façon de le faire?

+1

Question muette ... que voulez-vous dire par "morues"? –

+0

Quelle base de données utilisez-vous? –

+0

La base de données est MSSQL 2005 sur les morues ... les produits ressemblent plutôt aux types de produits qui ont beaucoup de variations (comme la taille des couleurs etc.) et le code est le produit réel celui avec un numéro de série – bogdanbrudiu

Répondre

5

Ceci est un défi commun. La création de données hiérarchiques à partir d'une base de données relationnelle n'est pas toujours élégante. Si ces données ne sont pas mises à jour en permanence, une option est de le cracher en XML et de le mettre en cache pour l'application.

Si vous souhaitez le conserver dans la base de données, il s'agit d'une solution courante: Managing Hierarchical Data in MySQL.

+0

+1 traversier est définitivement le chemin à parcourir – rmeador

+0

+1 bien article sur MySQL –

+0

@DA, jetez un oeil à la présentation que j'ai posté dans ma solution. Si vous aimez le modèle de jeu imbriqué, vous apprécierez encore plus le "perfectionnement", le modèle à intervalle imbriqué. – Sergi

0

Il existe différentes solutions pour représenter les arbres dans les bases de données. Je vous recommande vraiment de jeter un oeil à cette présentation, Trees in the database. Je travaille habituellement avec une base de données avec plusieurs niveaux et 1,5 millions de feuilles et le modèle d'intervalle imbriqué était vraiment éclairant.

0

Je ne sais pas si vous êtes coincé avec cette structure de données ou pas, mais vous devriez vraiment regarder l'article Managing Hierarchical Data in MySQL pour la gestion hiérarchique des données.

J'ai utilisé la solution décrite ici (dans Oracle et MS SQL Server) et c'est très rapide.