Comment puis-je sélectionner tous les nœuds feuilles dans une hiérarchie SQL sous un nœud donné?

StackOverflow https://stackoverflow.com/questions/378608

  •  22-08-2019
  •  | 
  •  

Question

J'ai un ensemble de données que les modèles d'une hiérarchie de catégories. Une catégorie racine contient un ensemble de catégories de haut niveau. Chaque catégorie de haut niveau contient un ensemble de sous-catégories.

Chaque sous catégorie a un ensemble d'organisations. Une organisation donnée peut apparaître dans plusieurs sous-catégories.

Les nœuds feuilles de cette hiérarchie sont des organisations. Une organisation peut apparaître potentiellement dans plusieurs sous-catégories.

Les données sont stockées dans trois tables SQL:

organizations
organization_id organization_name
1               Org A
2               Org B
3               Org C
4               Org D
5               Org E
6               Org F

categories
category_id parent_id category_name
0           NULL      Top Level Category
1           0         First Category
2           0         Second Category
3           1         Sub Category A
4           1         Sub Category B
5           1         Sub Category C
6           2         Sub Category D

organizations_categories -- Maps organizations to sub_categories
organization_id category_id
1               3
2               3
2               6
3               4
4               4
5               4
6               5
6               4
7               6
8               6

Je voudrais être en mesure de choisir une liste de toutes les organisations uniques dans une catégorie ou sous-catégorie.

La façon dont je le fais maintenant droit implique d'abord déterminer quelles sous-catégories ont été demandées et en boucle ensuite à travers chaque sub_category dans le code et effectuer une sélection pour obtenir toutes les organisations cartographiés à cette catégorie. Les résultats de chaque sélection sont ajoutés à un tableau. Ce tableau contient des doublons chaque fois qu'une organisation apparaît dans plusieurs sous-catégories.

J'aimerais remplacer cette bidouille avec une requête qui peut efficacement sélectionner une liste d'organisations distinctes donné une carte d'identité de l'une des catégories dans la hiérarchie.

Je devloping cette solution en utilisant PHP et MySQL.

Merci pour votre temps et suggestions.

Était-ce utile?

La solution

En supposant que la hiérarchie est toujours exactement 3 niveaux de profondeur:

SELECT DISTINCT
     O.organization_id,
     O.organization_name
FROM
     Categories CAT
INNER JOIN Categories SUB ON
     SUB.parent_id = CAT.category_id
INNER JOIN Category_Organizations CO ON
     CO.category_id = SUB.category_id
INNER JOIN Organizations O ON
     O.organization_id = CO.organization_id
WHERE
     CAT.category_id = @category_id

Vous pouvez modifier que par un niveau pour vous permettre de passer un identifiant sous catégorie. Si vous ne savez pas à l'époque si vous avez ou non un identifiant de catégorie ou une sous catégorie id alors vous pouvez faire ce qui suit:

SELECT DISTINCT
     O.organization_id,
     O.organization_name
FROM
     Categories CAT
LEFT OUTER JOIN Categories SUB ON
     SUB.parent_id = CAT.category_id
INNER JOIN Category_Organizations CO ON
     CO.category_id IN (CAT.category_id, SUB.category_id)
INNER JOIN Organizations O ON
     O.organization_id = CO.organization_id
WHERE
     CAT.category_id = @category_id

Si votre hiérarchie peut avoir un certain nombre de niveaux inconnus (ou vous pensez qu'il pourrait à l'avenir) puis vérifier noreferrer arbres Joe Čelko et dans SQL pour hiérarchies Smarties pour d'autres façons de modéliser une hiérarchie. Il est probablement une bonne idée de le faire de toute façon.

Autres conseils

Je ne sais pas si votre modèle de données permettra, mais vous pouvez utiliser une seule colonne d'index et un arbre binaire pour stocker facilement ces informations dans une seule table « OrganizationTree ». a également l'avantage que vous utilisez une seule requête sans modification pour la recherche dans la catégorie, sous-catégorie ou niveaux d'organisation (par exemple me donner tous les résultats de la sous-catégorie X)

Hope this helps.

Adam.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top