2012-05-18 45 views
20

Tôi có một dự luật của bảng vật liệu được thiết lập như thế này:
mục - mẹSử dụng truy vấn MySQL phải đi qua hàng để thực hiện một cây đệ quy

Kết quả cuối cùng khi tôi hiển thị danh mục vật liệu được rằng nó được hiển thị như thế này:

item 1 - parent 0  
    item 2 - parent 1  
    item 3 - parent 1  

kết quả cuối cùng cũng có thể là đa cấp như thế này:

item 3 - parent 0  
    item 4 - parent 3  
    item 76 - parent 3  

Và nó có thể đi vào vô cùng tận:

item 76 - parent 0  
    item 46 - parent 76  

item 46 - parent 0  
    item 25 - parent 46 

Ngay bây giờ, tôi hoặc là chỉ nhận được 1 cấp độ từ cơ sở dữ liệu:

SELECT * FROM bom WHERE parentId = $itemId (shorthand)

Hoặc kéo mỗi dòng từ bảng và sử dụng hàm đệ quy của tôi để sắp xếp ra chỉ là những người tôi cần, nhưng điều này rõ ràng là không hiệu quả vì tôi chỉ có thể cần 10 hàng, nhưng tôi kéo 10.000 bản ghi. Đầu ra của hàm đệ quy sẽ chỉ tạo một cây như sau:

item 1 
    item 2 
    item 3 
     item 4 
     item 76 
     item 46 
      item 25 

Tất cả những gì tôi biết là tôi bắt đầu từ mục 1. Mục 5 có thể có cha mẹ là 11; họ không phải đi tuần tự. Tôi muốn có được tất cả các cành con trên cây. Làm thế nào tôi có thể làm truy vấn này trong mysql?

Trả lời

35

Quay lại vào ngày 24 tháng 10 năm 2011, ai đó đã đăng một question in the DBA StackExchange about tree traversal in MySQL. SQL cho MySQL không thể hỗ trợ nó.

Tôi đã viết ba (3) Thủ tục được lưu trữ (GetParentIDByID, GetAncestry và GetFamilyTree) trong my answer to that question. Hy vọng thông tin này sẽ giúp bạn xây dựng những gì bạn đang tìm kiếm.

+0

Thủ tục tuyệt vời. Nhưng sau đó 'SELECT id, GetFamilyTree (id) TỪ pctable;' ném một lỗi: _ERROR 1292 (22007): Giá trị DOUBLE bị cắt bớt không chính xác: '4,5'_. Tôi đã cố gắng để gỡ lỗi nó, nhưng vô ích. Bạn có ý kiến ​​gì không! Cảm ơn – idok

15

Bill Karwin đã đăng một bài giảng về hệ heirarchical data trong MySQL. Nếu thay đổi thiết kế cơ sở dữ liệu của bạn là một tùy chọn, có một số cách hấp dẫn khác để lưu trữ dữ liệu của bạn để giúp truy vấn dễ dàng hơn. Các cách tiếp cận ông bao gồm là:

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

slide 69 có một bảng đẹp thể hiện những ưu và nhược điểm của từng phương pháp, vì vậy tôi khuyên bạn nên xem trang trình bày đó trước để xem phương pháp nào có thể phù hợp với bạn, sau đó quay lại và xem chi tiết về cách triển khai. Lưu ý rằng thiết kế bạn đã chọn (danh sách kề) là chỉ một trong bốn thiết kế được trình bày khiến việc truy vấn một cây con trở nên khó khăn. Có nói rằng, nếu bạn không thể thay đổi thiết kế của bạn hoặc bạn muốn gắn bó với danh sách kề thì tôi phải đồng ý với Didier rằng bạn nên xem Quassnoi 's bài viết "Hierarchical queries in MySQL". Đây là một bài viết rất rõ ràng và giải thích cách viết truy vấn một cách hiệu quả.

+2

Tài nguyên tuyệt vời. Tôi đặt nó lên cho tiền thưởng để có được thông tin như thế. Cảm ơn bạn! – phpmeh

Các vấn đề liên quan