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

Truy vấn số lượng các mục của một cây

Với những ràng buộc đó, không có cách nào. Trong trường hợp như vậy, bạn sẽ truy xuất tất cả cây và xây dựng một phía máy khách 'đồi' hoặc thực hiện các truy vấn đệ quy, bất kỳ điều gì hiệu quả nhất trong trường hợp cụ thể.

Với ràng buộc bổ sung là có một số cấp độ phân cấp cố định , bạn có thể làm điều này với nhiều THAM GIA.

Trong trường hợp chung, có một số sửa đổi cấu trúc để cho phép khắc phục những hạn chế đó. Trong thực tế, bạn nới lỏng ràng buộc "ĐÂY là cấu trúc bảng của tôi", cho phép thêm các trường bổ sung.

Ví dụ:bạn có thể bổ sung cấu trúc nút bằng left_id và đảm bảo rằng tất cả các ID nút đều theo thứ tự khi bạn truy cập đầu tiên độ sâu cây:

1 --- 2 -+- 3 -+- 4
         |     |
         |     +- 5
         +- 6 --- 7

Trong trường hợp này, nút 3 sẽ lưu giá trị "5", nút 6 sẽ lưu giá trị "7" và nút 2 cũng sẽ lưu giá trị "7". Mỗi nút lưu trữ trong LeftID tối đa giữa các LeftID con và ID riêng của nó .

Vì vậy, các nút không con có LeftID bằng ID của chúng. Nút 1 sẽ có LeftID 7 vì đó là LeftID của 2, lấy nó từ 6.

Trong tình huống này, tính các nút dễ dàng nếu không có lỗ nào trong chuỗi; tất cả con cháu của một nút là những nút có ID nằm giữa ID của nút bắt đầu và ID trái của nó; và các lá được xác định bằng cách có LeftID bằng ID.

Vì vậy, "tất cả các lá giảm dần từ id nút 17" sẽ là

CHỌN con. * TỪ bảng AS bảng parentJOIN AS bảng con (child.id> parent.id VÀ child.id <=parent.leftid) / * Con cháu / WHERE child.id =child.leftid / / AND parent.id =17; / Cha mẹ 17 tuổi

Cấu trúc này rất khó duy trì nếu bạn muốn có thể thực hiện việc cắt tỉa và phân nhánh, vì bạn cần đánh số lại tất cả các nút từ điểm cắt tỉa đến điểm nhánh, cũng như các nút đã di chuyển.

Một khả năng khác nếu bạn chỉ quan tâm đến việc đếm là giữ một bộ đếm trẻ em. Điều này có thể được duy trì bằng cách cập nhật nó lặp đi lặp lại, chọn tất cả các lá và đặt bộ đếm của chúng thành 0 (bạn xác định các lá thông qua THAM GIA TRÁI); sau đó tất cả các bậc cha mẹ có bộ đếm NULL có con có bộ đếm không phải NULL, cập nhật bộ đếm của họ thành SUM() bộ đếm dành cho trẻ em cộng với COUNT() của chính trẻ em; và tiếp tục cho đến khi số hàng cập nhật trở thành 0, đối với tất cả các nút có bộ đếm không phải NULL. Sau khi tỉa và nhánh, bạn chỉ cần đặt tất cả các bộ đếm thành NULL và lặp lại.

Cách tiếp cận cuối cùng này tốn một kết nối phản chiếu cho mỗi cấp độ phân cấp.



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Sự cố khi tìm kiếm với MySQL

  2. sự sụp đổ giới hạn mysql, dẫn đến tương tác dữ liệu

  3. lỗi chèn php + mysql

  4. Lệnh Alter trong Aurora DB (thêm một cột mới)

  5. làm thế nào để truyền hệ thập lục phân thành varchar (datetime)?