Tôi có một cấu trúc cây trong một bảng và nó sử dụng đường dẫn vật chất để cho phép tôi tìm thấy trẻ em một cách nhanh chóng. Tuy nhiên, tôi cũng cần phải sắp xếp các kết quả theo chiều sâu đầu tiên, như một trong những mong đợi với các trả lời của diễn đàn luồng.Phân loại cây với đường dẫn vật chất?
id | parent_id | matpath | created
----+-----------+---------+----------------------------
2 | 1 | 1 | 2010-05-08 15:18:37.987544
3 | 1 | 1 | 2010-05-08 17:38:14.125377
4 | 1 | 1 | 2010-05-08 17:38:57.26743
5 | 1 | 1 | 2010-05-08 17:43:28.211708
7 | 1 | 1 | 2010-05-08 18:18:11.849735
6 | 2 | 1.2 | 2010-05-08 17:50:43.288759
9 | 5 | 1.5 | 2010-05-09 14:02:43.818646
8 | 6 | 1.2.6 | 2010-05-09 14:01:17.632695
Vì vậy, kết quả cuối cùng thực sự nên được sắp xếp như thế này:
id | parent_id | matpath | created
----+-----------+---------+----------------------------
2 | 1 | 1 | 2010-05-08 15:18:37.987544
6 | 2 | 1.2 | 2010-05-08 17:50:43.288759
8 | 6 | 1.2.6 | 2010-05-09 14:01:17.632695
3 | 1 | 1 | 2010-05-08 17:38:14.125377
4 | 1 | 1 | 2010-05-08 17:38:57.26743
5 | 1 | 1 | 2010-05-08 17:43:28.211708
9 | 5 | 1.5 | 2010-05-09 14:02:43.818646
7 | 1 | 1 | 2010-05-08 18:18:11.849735
Làm thế nào tôi có thể làm việc mà ra? Tôi có thể làm điều đó trong SQL thẳng (đây là PostgreSQL 8.4) hoặc nên thêm thông tin bổ sung vào bảng này?
Cập nhật: cố gắng giải thích tiêu chí sắp xếp tốt hơn.
Hãy tưởng tượng id '1' là bài đăng gốc vào diễn đàn và mọi thứ có 'matpath' bắt đầu bằng '1' là con của bài đăng đó. Vì vậy, các id từ 2 đến 5 là các câu trả lời trực tiếp cho 1 và nhận được các đường dẫn của '1'. Tuy nhiên, id 6 là một câu trả lời 2, không trực tiếp đến 1, vì vậy nó nhận được một matpath 1.2. Điều này có nghĩa rằng đối với một diễn đàn ren với tổ hợp, với tất cả id thể hiện trong các bảng, cấu trúc của diễn đàn sẽ trông như thế này, vì vậy yêu cầu đặt hàng:
* id 1 (root post)
* id 2
* id 6
* id 8
* id 3
* id 4
* id 5
* id 9
* id 7
Tôi đã mở rộng bài đăng gốc để giải thích yêu cầu sắp xếp. Xin lỗi vì sự nhầm lẫn. – Ovid
@Ovid: Ok, có ý nghĩa. Tôi sẽ giải thích làm thế nào để làm điều đó. – RedFilter
Chỉ cần thêm điều đó. Làm việc như một say mê. Cảm ơn bạn. – Ovid