Mysql
 sql >> Cơ Sở Dữ Liệu >  >> RDS >> Mysql

truy vấn mySQL để chọn con

Những gì tôi đã làm trong các dự án trước đây mà tôi cần làm điều tương tự, tôi đã thêm hai cột mới.

  • i_depth:giá trị int về độ sâu của danh mục
  • nvc_breadcrumb:đường dẫn đầy đủ của danh mục ở loại định dạng breadcrumb

Và sau đó, tôi đã thêm một trình kích hoạt vào bảng chứa thông tin danh mục để thực hiện việc sau (cả ba bản cập nhật đều nằm trong cùng một trình kích hoạt) ...

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

Và sau đó, chỉ cần tham gia với bảng sản phẩm của bạn trên ID danh mục và thực hiện "LIKE '% / [CATEGORYID] /%'". Hãy nhớ rằng điều này đã được thực hiện trong MS SQL, nhưng nó phải đủ dễ dàng để dịch sang phiên bản MySQL.

Nó có thể đủ tương thích để cắt và dán (sau khi thay đổi tên bảng và cột).

Mở rộng giải thích ...

t_categories (như bây giờ) ...

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 (sau khi sửa đổi) ...

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 (sau khi sử dụng tập lệnh tôi đã đưa)

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 (như bạn có bây giờ, không có sửa đổi) ...

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

Tham gia các danh mục và sản phẩm (trong đó danh mục là C, sản phẩm là 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

Bây giờ, giả sử rằng bảng sản phẩm đã hoàn thiện hơn để có những thứ trong mỗi danh mục và không có NULL, bạn có thể thực hiện "Breadcrumb LIKE '% / 5 /%'" để nhận ba mục cuối cùng của bảng cuối cùng mà tôi đã cung cấp. Lưu ý rằng nó bao gồm các mục trực tiếp và con của danh mục (như TV Samsung). Nếu bạn CHỈ muốn các mục danh mục cụ thể, chỉ cần thực hiện "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. một cách đơn giản để tính tổng kết quả từ UNION trong MySql

  2. Chèn một đối tượng datetime.datetime trong Python vào MySQL

  3. Hàng html đầu tiên không được hiển thị

  4. Nhập GeoLite2 của MaxMind vào MySQL

  5. Dấu phân cách trong MySQL