sql >> Database >  >> RDS >> Mysql

mySQL-query voor het selecteren van kinderen

Wat ik heb gedaan in eerdere projecten waar ik hetzelfde moest doen, ik heb twee nieuwe kolommen toegevoegd.

  • i_depth:int waarde van hoe diep de categorie is
  • nvc_breadcrumb:volledig pad van de categorie in een breadcrumb-formaat

En toen heb ik een trigger aan de tabel toegevoegd die de categorie-informatie bevat om het volgende te doen (alle drie updates bevinden zich in dezelfde trigger)...

-- 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

En doe dan gewoon een join met je producttabel op de categorie-ID en doe een "LIKE '%/[CATEGORYID]/%' ". Houd er rekening mee dat dit in MS SQL is gedaan, maar het zou gemakkelijk genoeg moeten zijn om te vertalen naar een MySQL-versie.

Het is misschien net compatibel genoeg voor knippen en plakken (na wijziging van de tabel- en kolomnaam).

Uitbreiding uitleg...

t_categories (zoals het er nu uitziet)...

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 (na wijziging)...

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 (na gebruik van het script dat ik gaf)

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 (zoals je het nu hebt, geen aanpassingen)...

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

Word lid van categorieën en producten (waarbij categorieën C is, producten 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

Ervan uitgaande dat de producttabel completer was, zodat er dingen in elke categorie zijn en geen NULL's, zou je een "Breadcrumb LIKE '%/5/%'" kunnen doen om de laatste drie items van de laatste tabel die ik heb verstrekt te krijgen. Merk op dat het de directe items en onderliggende items van de categorie bevat (zoals de Samsung-tv). Als je ALLEEN de specifieke categorie-items wilt, doe dan gewoon een "c.cat =5".



  1. Hoe vind ik het op één na hoogste salaris van de werknemerstabel?

  2. Hoe kan ik voorbereide verklaringen in CodeIgniter gebruiken?

  3. geëmuleerde voorbereide verklaringen versus echte voorbereide verklaringen

  4. mysql converteert meerdere rijen naar kolommen in een enkele rij