Mysql
 sql >> Cơ Sở Dữ Liệu >  >> RDS >> Mysql

Nhận tổng từ cây nút

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.



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Kiểm tra xem địa chỉ IP có được lưu trữ trong cơ sở dữ liệu hay không

  2. nhóm theo các giá trị not-null

  3. Các ký tự có dấu trong bảng mySQL

  4. node.js kết nối mySQL thông qua một singleton

  5. Đặt kết quả của truy vấn MySQL thành JComboBox