Mysql
 sql >> база данни >  >> RDS >> Mysql

mySQL заявка за избор на деца

Това, което направих в предишни проекти, където трябваше да направя същото, добавих две нови колони.

  • i_depth:int стойност за това колко дълбока е категорията
  • nvc_breadcrumb:пълен път на категорията във формат тип breadcrumb

И след това добавих тригер към таблицата, която съдържа информацията за категорията, за да направя следното (и трите актуализации са в един и същи тригер)...

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

И след това просто направете присъединяване към таблицата с вашите продукти на идентификатора на категорията и направете „ХАРЕСВАНЕ '%/[CATEGORYID]/%' ". Имайте предвид, че това е направено в MS SQL, но трябва да е достатъчно лесно за превод във версия на MySQL.

Може просто да е достатъчно съвместим за изрязване и поставяне (след промяна на името на таблица и колона).

Разширяване на обяснението...

t_categories (както е сега)...

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 (след модификация)...

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 (след използване на скрипта, който дадох)

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 (както го имате сега, без модификации)...

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

Присъединете се към категории и продукти (където категориите са C, продуктите са 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

Сега, ако приемем, че таблицата с продуктите е по-пълна, така че да има неща във всяка категория и да няма NULL, можете да направите „Хлебна троха КАТО '%/5/%'", за да получите последните три елемента от последната таблица, която предоставих. Обърнете внимание, че включва директните елементи и деца от категорията (като телевизора Samsung). Ако искате САМО елементите от конкретните категории, просто направете "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. mysql твърде много индекси?

  2. Вмъкнете съдържанието на файла в колоната на MySQL таблицата

  3. Как да създадете PHP таблица с две колони със стойности от базата данни?

  4. MySQLdb Python вмъкнете %d и %s

  5. как да проверите и зададете max_allowed_packet mysql променлива