2011-11-12 5 views
11

Tôi đang cố gắng tìm tất cả cha mẹ, ông bà, v.v. của một trường cụ thể với bất kỳ chiều sâu nào. Ví dụ: nếu cấu trúc bên dưới, nếu tôi cung cấp 5, các giá trị được trả về phải là 1, 2, 3 và 4.Truy vấn phân cấp trong MySQL

| a | b | 
----------- 
| 1 | 2 | 
| 2 | 3 | 
| 3 | 4 | 
| 4 | 5 | 
| 3 | 6 | 
| 4 | 7 | 

Làm cách nào để thực hiện điều này?

+2

Bạn phải thay đổi giản đồ cho việc này. Đọc bài trình bày của [@BillKarwin] (http://stackoverflow.com/users/20860/bill-karwin) có tiêu đề [Mô hình cho dữ liệu phân cấp với SQL và PHP] (http://www.slideshare.net/billkarwin/models -cho-phân cấp-dữ liệu), trên các mô hình khác nhau và cách triển khai chúng. – Shef

+0

@Shef: Tôi nên thực hiện những thay đổi nào trong lược đồ và cách viết truy vấn. –

+0

@BillKarwin: Trong ppt của bạn, bạn đã đề cập rằng trên logic không thể được thực hiện bằng cách sử dụng mysql.Is nó như vậy? –

Trả lời

22
SELECT @id := 
     (
     SELECT senderid 
     FROM mytable 
     WHERE receiverid = @id 
     ) AS person 
FROM (
     SELECT @id := 5 
     ) vars 
STRAIGHT_JOIN 
     mytable 
WHERE @id IS NOT NULL 
+1

waw ... có thể nguy hiểm nếu bạn sử dụng nó quá nhiều, như trong một trang web lớn? – Wiliam

+2

@Wiliam: nó không nâng cấp an toàn vì 'MySQL' không xác định rõ hành vi biến phiên. Tuy nhiên, đó là cách duy nhất để xử lý danh sách kề nhau trong truy vấn thời trang kịp thời. – Quassnoi

+0

Chỉ để tham khảo (là "nguy hiểm" có thể có nghĩa là về bất cứ điều gì) ai đó có thể giải thích về điều này làm cho nó nguy hiểm? Và điều gì sẽ khiến nó trở thành/không nguy hiểm? – Mike

-7

Câu trả lời sau không chỉ là MYSQL mà còn sử dụng PHP. Câu trả lời này có thể hữu ích cho tất cả những người kết thúc trên trang này trong quá trình tìm kiếm của họ (như tôi đã làm) nhưng không giới hạn chỉ sử dụng MYSQL.

Nếu bạn có một cơ sở dữ liệu có cấu trúc lồng nhau không rõ chiều sâu, bạn có thể in ra các nội dung sử dụng một vòng lặp đệ quy:

function goDownALevel($parent){ 
    $children = $parent->getChildren(); //underlying SQL function 
    if($children != null){ 
      foreach($children as $child){ 
       //Print the child content here 
       goDownALevel($child); 
      } 
    } 
} 

Chức năng này cũng có thể được viết lại bằng bất kỳ ngôn ngữ khác như Javascript.