2010-07-18 40 views
9

Tôi có bảng sau:đệ quy tự truy vấn

myTable: 
+----+----------+ 
| id | parentID | 
+----+----------+ 
| 1 |  null | 
| 2 |  1 | 
| 3 |  1 | 
| 4 |  2 | 
| 5 |  4 | 
----------------- 

tôi muốn để có được tất cả các hàng truy tìm trở lại cho đến khi không có ParentID nữa. Vì vậy " .... WHERE id = 5" sẽ cho tôi:

5, 4, 2, 1 
+4

Bill Karwin thông thường đã tạo ra một số giải thích tốt về dữ liệu thuật ngữ và cách sử dụng các giải pháp khác nhau: http://www.slideshare.net/billkarwin/models-for-hierarchical-data – Wrikken

+0

MySQL không có CTE đệ quy nên tôi nghĩ điều này sẽ cần một con trỏ nếu bạn cần phải xử lý một chiều sâu tùy ý. Đang thay đổi cấu trúc http://dev.mysql.com/tech-resources/articles/hierarchical-data.html một tùy chọn? Hoặc chúng ta có thể giả định một số chiều sâu tối đa? Ngoài ra, hãy xem câu hỏi liên quan này http://stackoverflow.com/questions/169817/is-it-possible-to-query-a-tree-structure-table-in-mysql-in-a-single-query-to-any –

+0

Slide của Bill Karwin thật sự rất tuyệt. – iddqd

Trả lời

9

Bạn đang sắp xếp dữ liệu phân cấp của bạn bằng cách sử dụng adjacency list model. Thực tế là các hoạt động đệ quy như vậy khó thực tế là một hạn chế lớn của mô hình này.

Một số DBMS, chẳng hạn như SQL Server 2005, Postgres 8.4 và Oracle 11g, hỗ trợ truy vấn đệ quy bằng cách sử dụng common table expressions với từ khóa WITH.

Đối với MySQL, bạn có thể quan tâm đến việc kiểm tra ra các bài viết sau đây trong đó mô tả một mô hình thay thế (các nested set model), mà làm cho hoạt động đệ quy dễ dàng hơn (có thể):

Ngoài ra, tôi cũng khuyên bạn nên kiểm tra số Bill Karwin's presentation được nêu trong các nhận xét ở trên. Mô hình bảng đóng được mô tả là một lựa chọn rất hợp lệ cho bộ lồng nhau.

+0

ok, cảm ơn rất nhiều về các liên kết và nhận xét, tôi nhận được nó ngay bây giờ. Vì tôi không giả định cây rất sâu và tôi chỉ cần điều này hiếm khi, tôi đã quyết định chỉ cần thực hiện hai tham gia tự, và nếu parentID vẫn là NOT NULL, tôi chạy lại truy vấn. – iddqd

+0

@iddqd: Vâng, có thể thực hiện được. Nhưng như bạn thấy, đó là giới hạn của mô hình này. –

+0

hoàn toàn, thx. – iddqd

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