Mysql
 sql >> Teknologi Basis Data >  >> RDS >> Mysql

kueri mySQL untuk memilih anak-anak

Apa yang telah saya lakukan di proyek sebelumnya di mana saya perlu melakukan hal yang sama, saya menambahkan dua kolom baru.

  • i_depth:nilai int seberapa dalam kategorinya
  • nvc_breadcrumb:jalur lengkap kategori dalam format jenis remah roti

Lalu saya menambahkan pemicu ke tabel yang menampung informasi kategori untuk melakukan hal berikut (ketiga pembaruan berada di pemicu yang sama)...

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

Dan kemudian lakukan join dengan tabel produk Anda pada ID kategori dan lakukan "LIKE '%/[CATEGORYID]/%'". Ingatlah bahwa ini dilakukan dalam MS SQL, tetapi harus cukup mudah untuk diterjemahkan ke dalam versi MySQL.

Mungkin cukup kompatibel untuk cut and paste (setelah perubahan nama tabel dan kolom).

Perluasan penjelasan...

t_categories (seperti yang ada sekarang)...

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 (setelah dimodifikasi)...

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 (setelah menggunakan skrip yang saya berikan)

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 (seperti yang Anda miliki sekarang, tidak ada modifikasi)...

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

Bergabunglah dengan kategori dan produk (di mana kategori adalah C, produk adalah 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

Sekarang dengan asumsi bahwa tabel produk lebih lengkap sehingga ada barang di setiap kategori dan tidak ada NULL, Anda bisa melakukan "Breadcrumb LIKE '%/5/%'" untuk mendapatkan tiga item terakhir dari tabel terakhir yang saya berikan. Perhatikan bahwa itu termasuk item langsung dan anak-anak dari kategori (seperti tv Samsung). Jika Anda ingin HANYA item kategori tertentu, lakukan saja "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 - Mengapa aturan COLLATION diabaikan oleh operator LIKE untuk karakter Jerman

  2. Bagaimana cara hash kata sandi di MySQL?

  3. Bagaimana cara menyimpan URL di MySQL

  4. Bagaimana saya bisa bergabung dengan beberapa tabel SQL menggunakan ID?

  5. Tambahkan banyak data dengan beberapa interval waktu di Jawa