2012-07-08 66 views
5

Tôi đã có một bảng nơi các sản phẩm được phân loại dựa trên mối quan hệ phân cấp như cấu trúc cây. Tôi phải chọn một danh mục và tất cả các danh mục con ở mọi cấp độ. Xem hình ảnh bên dưới:SQL cho mối quan hệ phân cấp

enter image description here

ví dụ: tôi muốn một câu lệnh sql khi tôi truy vấn chuyển id = 11, nó trả về cho tôi (19,20,21,22,23,24,25,26)

Trả lời

1
SELECT * FROM `Products` 
WHERE parentId IN (
    SELECT id FROM `Products` 
    WHERE parentId = 11) 

LƯU Ý: Điều này sẽ không có tác dụng nếu phân cấp của bạn sâu hơn 2 cấp.

9

Có một số cách khác nhau để lưu trữ dữ liệu heirarchical trong MySQL. Hãy xem số presentation của Bill Karwin thể hiện bốn tùy chọn.

  • danh sách kề
  • Đường dẫn Enumeration
  • Nested Thiết
  • Đóng Bảng

Bạn đang sử dụng danh sách mô hình kề để lưu trữ dữ liệu heirarchical, nhưng tiếc là đây là khó khăn nhất mô hình bạn có thể chọn để truy vấn các subtrees.

nested sets query subtree

lựa chọn của bạn là:

  • đổi sang một mô hình khác nhau.
  • Giới hạn truy vấn ở n cấp độ sâu.
  • Sử dụng quy trình được lưu trữ để truy vấn đệ quy. Để biết thêm thông tin về điều này, hãy xem loạt bài viết của Quassnoi - Hierarchical queries in MySQL.
1

Bạn có thể thay đổi cấu trúc dữ liệu của mình một chút để bao gồm cột lanh được tính toán không. Có một số great article cho bạn thấy khái niệm chung (bỏ qua kiểu cơ sở dữ liệu).

Về cơ bản cột linage tính của bạn nên chứa danh sách các bậc phụ huynh trong đó ví dụ

mục 26 sẽ chứa \11\

Nếu bạn đã có một subitem bạn có thể có

\11\subitem\

Sau đó, bạn có thể chỉ cần thực hiện kiểm tra tương tự trên bảng linage của bạn, nhanh hơn nhiều so với tìm kiếm lặp lại và bạn có thể tạo nó bằng cách sử dụng một proc hoặc trigger được lưu trữ.

Node ParentNode EmployeeID Depth Lineage 
100  NULL   1001   0 /
101  100   1002   1 /100/ 
102  101   1003   2 /100/101/ 
103  102   1004   3 /100/101/102/ 
104  102   1005   3 /100/101/102/ 
105  102   1006   3 /100/101/102/ 
0

Đây là lộn xộn, và bạn sẽ phải làm n công đoàn, trong đó n là cách sâu hệ thống cấp bậc của bạn, nhưng nó cũng làm việc:

SELECT * FROM `Products` WHERE parentId IN (
    SELECT id FROM `Products` WHERE parentId = 11) 
UNION 
SELECT * FROM `Products` WHERE parentId IN (
    SELECT id FROM `Products` WHERE parentId IN (
     SELECT id FROM `Products` WHERE parentId = 11)) 
UNION 
SELECT * FROM `Products` WHERE parentId IN (
    SELECT id FROM `Products` WHERE parentId IN (
     SELECT id FROM `Products` WHERE parentId IN (
      SELECT id FROM `Products` WHERE parentId = 11))) 
Các vấn đề liên quan