LTREE
Bạn gần như đang đi đúng hướng. Bạn gần như tình cờ gặp hệ thống 'LTREE' lưu trữ dữ liệu hierachial trong cơ sở dữ liệu. Bạn chỉ cần thực hiện một sửa đổi nhỏ. chỉ có vậy thôi.
Bảng của bạn có thể trông như thế này:
CREATE TABLE Table1
(`id` int, `parent_id` int, `name` varchar(13),
`path` char(10),
`money` int)
;
Và dữ liệu của bạn có thể trông như thế này.
(1, 0, 'company 1', '1', 10),
(2, 1, 'child 1', '1.1', 10),
(3, 2, 'child 2', '1.1.1', 10),
(4, 1, 'child 3', '1.2', 10,),
(4, 1, 'company 2', '2', 10),
(4, 1, 'child 2.1', '2.1', 10)
Cột đường dẫn giúp xác định công ty nào là công ty con của công ty khác. Lưu ý rằng bạn không thực sự cần phải có allmoney
cột. Điều này được tạo động.
Và làm thế nào để bạn tìm thấy tất cả số tiền thuộc về công ty đầu tiên?
select sum(money) from Table1 where path >= '1' and path < '2'
Lưu ý rằng trong cấu trúc mà chúng ta đã tạo, child1 là cha của child2. Vậy làm cách nào để tìm allmoney cho child1?
select sum(money) from Table1 where path >= '1.1' and path < '1.2'
Chỉ có một truy vấn và không có đệ quy.
MPTT
Một cách tiếp cận phổ biến khác để tìm nạp dữ liệu phân cấp là sử dụng Traversal cây đơn hàng đã sửa đổi trước. Đã có một bài báo xuất sắc về Sitepoint trong nhiều năm, điều này giải thích cách thực hiện điều này với rất nhiều mã mẫu.