2011-02-16 4 views
1

j'ai "produit" table il contient tous les détails des produits.
comment montrer dans la hiérarchie ,,

product_id product_type_id internal_name 
1001  finishedgood   nokia 
1002  rawmaterial   chip 
1003  subassembly   diaplay 
1004  rawmaterial   displaybase 

cela signifie faire téléphone Nokia (finishedgood) entreprise a besoin
puce

(matière première), l'affichage (sous-ensemble). pour faire écran (sous-ensemble) dont il a besoin à nouveau
displaybase (matière première)

maintenant les détails de table "de productassoc"

product_id product_id_to 
    1001   1002   
    1001   1003   
    1003   1004  

ma question: je veux retrive tous les objets nécessaires pour nokia fabrication

cette requête renvoie le niveau 1 des biens sont nécessaires. (Je veux afficher les matières premières nécessaires pour
sous-ensemble aussi)

requête:

select pa.product_id,pa.product_id_to,p.product_type_id,p.internal_name 
     from product p, 
     product_assoc pa 
     where p.product_id=pa.product_id_to and pa.product_id=1001 

o/p

product_id product_id_to product_type_id  internal_name 
    1001   1002   rawmaterial   chip 
    1001   1003   subassembly   display 

-----
je veux afficher rawmaterials nécessaire pour sous-ensemble aussi. Signifie que ma requête doit renvoyer tous les rawmaterials et sous-assemblages nécessaires pour rendre
finishedgood. et aussi les matières premières nécessaires pour les sous-assemblages.

Ceci est seulement un échantillon. J'avais environ 100 composants pour un produit.

+0

espère que cela peut être utile: http://stackoverflow.com/questions/11064913/achieve-hierarchy-parent-child-relationship-in-an -effectif et facile –

Répondre

0

je recommande l'ajout d'une colonne appelée quelque chose comme « construction »

Faire au moins un varchar (255) ou plus si besoin est de tenir les valeurs dont vous aurez besoin, qui sera la chaîne complète du parent au produit lui-même utilisé dans la construction de la chose. Assurez-vous que vos numéros de produit sont toujours de la même longueur (ou utilisez LPAD avec des zéros ou des espaces sinon, pour être sûr), et remplissez cela avec un script qui construit ces chaînes de construction à partir des données existantes, jointes par un caractère (':', par exemple).

Cela vous donne des valeurs qui ressemblent, à partir de vos données:

product_id product_type_id internal_name construction 
1001  finishedgood   nokia  1001 
1002  rawmaterial   chip  1001:1002 
1003  subassembly   diaplay  1001:1003 
1004  rawmaterial   displaybase 1001:1003:1004 

Cela vous donne une colonne facile à trier. Ensuite, assurez-vous que toutes les autres INSERT aux tables suivent cette logique.

Pour sélectionner cela, il suffit d'utiliser LIKE dans la clause WHERE:

SELECT * 
    FROM product 
    WHERE construction LIKE '1001%' 
ORDER BY construction 

La partie amusante de c'est que vous pouvez, dans votre script retrival, comptez le nombre de colons pour déterminer la « profondeur » du produit. Cela facilite le formatage de la sortie et autres.Par exemple, dans un gestionnaire de mod_perl sortie HTML que vous pourriez dire:

while (my $p = $get_parts->fetchrow_hashref) { 
    $r->print("<li style='text-indent: @{[scalar @{[($p->{construction} =~ /:/]} * 5]}em'>$p->{product_id}: $p->{internal_name} ($p->{product_type_id})</li>"); 
} 
Questions connexes