Mysql
 sql >> Base de données >  >> RDS >> Mysql

requête mySQL pour sélectionner les enfants

Ce que j'ai fait dans des projets précédents où j'avais besoin de faire la même chose, j'ai ajouté deux nouvelles colonnes.

  • i_depth :valeur int de la profondeur de la catégorie
  • nvc_breadcrumb :chemin complet de la catégorie dans un format de type fil d'Ariane

Et puis j'ai ajouté un déclencheur au tableau qui contient les informations de catégorie pour faire ce qui suit (les trois mises à jour sont dans le même déclencheur)...

-- Reset all branches
UPDATE t_org_branches
    SET nvc_breadcrumb = NULL,
    i_depth = NULL

-- Update the root branches first
UPDATE t_org_branches 
    SET nvc_breadcrumb = '/', 
        i_depth = 0 
    WHERE guid_branch_parent_id IS NULL

-- Update the child branches on a loop
WHILE EXISTS (SELECT * FROM t_branches WHERE i_depth IS NULL) 
    UPDATE tobA 
        SET tobA.i_depth = tobB.i_depth + 1, 
            tobA.nvc_breadcrumb = tobB.nvc_breadcrumb + Ltrim(tobA.guid_branch_parent_id) + '/' 
        FROM t_org_branches AS tobA
            INNER JOIN t_org_branches AS tobB ON (tobA.guid_branch_parent_id = tobB.guid_branch_id) 
        WHERE tobB.i_depth >= 0 
            AND tobB.nvc_breadcrumb IS NOT NULL 
            AND tobA.i_depth IS NULL

Et puis faites simplement une jointure avec votre table de produits sur l'ID de catégorie et faites un "LIKE '%/[CATEGORYID]/%'". Gardez à l'esprit que cela a été fait dans MS SQL, mais cela devrait être assez facile à traduire dans une version MySQL.

Il pourrait juste être assez compatible pour un copier-coller (après le changement de nom de table et de colonne).

Élargissement de l'explication...

t_categories (telles qu'elles sont actuellement)...

Cat Parent  CategoryName
1   NULL    MyStore
2   1       Electronics
3   1       Clothing
4   1       Books
5   2       Televisions
6   2       Stereos
7   5       Plasma
8   5       LCD

t_categories (après modification)...

Cat  Parent  CategoryName   Depth   Breadcrumb
1   NULL    MyStore         NULL    NULL    
2   1       Electronics     NULL    NULL
3   1       Clothing        NULL    NULL
4   1       Books           NULL    NULL
5   2       Televisions     NULL    NULL
6   2       Stereos         NULL    NULL
7   5       Plasma          NULL    NULL
8   5       LCD             NULL    NULL

t_categories (après utilisation du script que j'ai donné)

Cat  Parent  CategoryName   Depth   Breadcrumb
1   NULL    MyStore         0       /   
2   1       Electronics     1       /1/
3   1       Clothing        1       /1/
4   1       Books           1       /1/
5   2       Televisions     2       /1/2/
6   2       Stereos         2       /1/2/
7   5       LCD             3       /1/2/5/
8   7       Samsung         4       /1/2/5/7/

t_products (comme vous l'avez maintenant, pas de modifications)...

ID   Cat Name
1   8   Samsung LNT5271F
2   7   LCD TV mount, up to 36"
3   7   LCD TV mount, up to 52"
4   5   HDMI Cable, 6ft

Joindre des catégories et des produits (où catégories est C, produits est P)

C.Cat Parent CategoryName   Depth   Breadcrumb  ID   p.Cat  Name
1    NULL   MyStore         0       /           NULL NULL   NULL
2    1      Electronics     1       /1/         NULL NULL   NULL
3    1      Clothing        1       /1/         NULL NULL   NULL
4    1      Books           1       /1/         NULL NULL   NULL
5    2      Televisions     2       /1/2/       4    5      HDMI Cable, 6ft
6    2      Stereos         2       /1/2/       NULL NULL   NULL
7    5      LCD             3       /1/2/5/     2    7      LCD TV mount, up to 36"
7    5      LCD             3       /1/2/5/     3    7      LCD TV mount, up to 52"
8    7      Samsung         4       /1/2/5/7/   1    8      Samsung LNT5271F

Maintenant, en supposant que la table des produits était plus complète pour qu'il y ait des choses dans chaque catégorie et pas de NULL, vous pourriez faire un "Breadcrumb LIKE '%/5/%'" pour obtenir les trois derniers éléments de la dernière table que j'ai fournie. Notez qu'il inclut les éléments directs et les enfants de la catégorie (comme le téléviseur Samsung). Si vous voulez UNIQUEMENT les éléments de la catégorie spécifique, faites simplement un "c.cat =5".