Mysql
 sql >> Baza danych >  >> RDS >> Mysql

Zapytanie mySQL do wybierania dzieci

To, co zrobiłem w poprzednich projektach, w których musiałem zrobić to samo, dodałem dwie nowe kolumny.

  • i_depth:wartość int określająca głębokość kategorii
  • nvc_breadcrumb:pełna ścieżka kategorii w formacie typu breadcrumb

A potem dodałem wyzwalacz do tabeli, która zawiera informacje o kategorii, aby wykonać następujące czynności (wszystkie trzy aktualizacje są w tym samym wyzwalaczu)...

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

A potem po prostu połącz z tabelą produktów na identyfikatorze kategorii i wykonaj "LIKE '%/[CATEGORYID]/%'". Pamiętaj, że zostało to zrobione w MS SQL, ale powinno być wystarczająco łatwe do przetłumaczenia na wersję MySQL.

Może być po prostu wystarczająco kompatybilny do wycinania i wklejania (po zmianie nazwy tabeli i kolumny).

Rozszerzenie wyjaśnienia...

t_categories (w obecnej formie)...

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 (po modyfikacji)...

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 (po użyciu podanego przeze mnie skryptu)

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 (tak jak teraz, bez modyfikacji)...

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

Dołącz do kategorii i produktów (gdzie kategoria to C, produkty to 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

Teraz zakładając, że tabela produktów była bardziej kompletna, więc w każdej kategorii są rzeczy i nie ma wartości NULL, możesz zrobić "Okruszek chleba LIKE '%/5/%'", aby uzyskać ostatnie trzy elementy z ostatniej podanej tabeli. Zwróć uwagę, że zawiera bezpośrednie elementy i elementy podrzędne kategorii (takie jak telewizor Samsung). Jeśli chcesz TYLKO określone elementy kategorii, po prostu zrób „c.cat =5”.



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. pokazać tabele z podobnymi do używania Java i MySQL?

  2. Najprostsze przejście z MySQL do MySQLi

  3. PDO::bindParam w pętli foreach, czy wszystkie wartości są takie same?

  4. Jak mogę dodać klucz obcy podczas tworzenia nowej tabeli?

  5. MySQL wybierz sumę z grupowaniem według i pustymi wartościami